Time out when executing a search wpf

When i execute a search in my application I want to have a timeout-function that gives the user a message and stops the search after 10 seconds.

How is this possible? Can you show me the code for that?

Let me know if you need to se my code and which part you need to see.

Thank you

Hello! Here is the Code. Forgot to tell you im using a backgroundworker do the suggestions you posted wont work.

I want to set a time limit for this piece

private void worker_DoWork(object sender, DoWorkEventArgs e) { progress = 0; Stopwatch sw = new Stopwatch(); sw.Start(); var donewithwork = false;

        while (sw.ElapsedMilliseconds < 5000 && !donewithwork)
        {
            if (m_oWorker.CancellationPending == true)
            {
                e.Cancel = true;

            }

            else if (donewithwork != true)
            {
                                    {
                    try
                    {
                        progress = 10;
                        MongoServerSettings settings = new MongoServerSettings();
                        settings.Server = new MongoServerAddress("lysing.uia.no", 27017);
                        MongoServer server = new MongoServer(settings);
                        MongoDatabase database = server.GetDatabase("tweet_database");
                        var collection = database.GetCollection<Tweets>("docs");

                        var query = Query.And(Query.Matches("text", new BsonRegularExpression(new Regex(searchText, RegexOptions.IgnoreCase)))
                            /*, Query.Near("geo",58.1453, 7.9571, 1000, true)*//*, Query.Matches("created_at", "Jan")*/);


                        var cursor = collection.Find(query);
                        progress = 20;

                        // Sets the cursorLimit to the four same values as the radiobuttons indicates (50,100,500 and 1000)


                        if (cursorLimit != 0)
                        {
                            cursor.SetLimit(cursorLimit);
                        }


                            // If no value is picked (equals 0), this messagebox will appear
                        else
                        {
                            cursor.SetLimit(10);
                            MessageBox.Show("Du må velge en verdi på høyre side. Standard verdi er 10. ");
                        }

                        progress = 30;
                        Console.Write("2");

                     /*   Thread t = new Thread(TimeTick);
                        t.Start();*/



                        Console.Write("Elapsed time1 is:" + sw.ElapsedMilliseconds );


                        if (cursor.Size() == 0)
                        {
                            Console.Write("3");
                            MessageBox.Show("Ditt søk returnerte ingen treff. Vennligst prøv et annet søkeord.");
                            Console.Write("Elapsed expired time is:" + sw.Elapsed);
                         //   t.Join();

                            break;
                        }
                        progress = 40;

                        Console.Write("4");
                        Console.Write("Elapsed time2 is:" + sw.Elapsed);

                        if (m_oWorker.CancellationPending == true)
                        {

                            e.Cancel = true;

                        }

                        App.Current.Dispatcher.BeginInvoke(DispatcherPriority.Background, new ThreadStart(() =>

                       MainViewModel.TweetOC.Clear()));

                        App.Current.Dispatcher.BeginInvoke(DispatcherPriority.Background, new ThreadStart(() =>
                        MainViewModel.GeoOC.Clear()));
                        progress = 50;

                        foreach (var item in cursor)

                            if (m_oWorker.CancellationPending == true)
                            {

                                e.Cancel = true;

                            }

                            else if (item.geo != null && item.text != null)
                            {


                                App.Current.Dispatcher.BeginInvoke(DispatcherPriority.Background, new ThreadStart(() =>
                                 GeoOC.Add(item)));
                                TweetOC.Add(item);
                            }
                            else
                            {


                                App.Current.Dispatcher.BeginInvoke(DispatcherPriority.Background, new ThreadStart(() =>

                                MainViewModel.TweetOC.Add(item)));

                            }
                        progress = 60;
                        var size = cursor.Size();

                        if (cursorLimit == 0)
                        {
                            cursorLimit = 10;

                        }

                        if (m_oWorker.CancellationPending == true)
                        {

                            e.Cancel = true;

                        }

                        if ( 

                            MessageBox.Show( "Du fikk" + " " + size + " " + "treff av" + " " + cursor.Count() + " " + "mulige. rn" + " " +
                            "Ønsker du å hente ut de neste" + " " + cursorLimit + " " + "Svarene også?", "Antall mulig treff", MessageBoxButtons.YesNo) == DialogResult.Yes)
                        {   
                             var query2 = Query.And(Query.Matches("text", new BsonRegularExpression(new Regex(searchText, RegexOptions.IgnoreCase))));
                             var cursor2 = collection.Find(query2);
                            cursor2.Skip = cursorLimit;
                            cursor2.Limit = cursorLimit;
                            foreach (var item in cursor2)

                                if (m_oWorker.CancellationPending == true)
                                {

                                    e.Cancel = true;

                                }

                                else if (item.geo != null && item.text != null)
                                {


                                    App.Current.Dispatcher.BeginInvoke(DispatcherPriority.Background, new ThreadStart(() =>
                                     GeoOC.Add(item)));
                                    TweetOC.Add(item);
                                }
                                else
                                {


                                    App.Current.Dispatcher.BeginInvoke(DispatcherPriority.Background, new ThreadStart(() =>

                                    MainViewModel.TweetOC.Add(item)));

                                }

                        }



                        progress = 70;
                        System.Console.WriteLine("TweetViewCount:" + TweetOC.Count);
                        System.Console.WriteLine("GeoViewCount:" + GeoOC.Count);
                        Console.Write("Elapsed time3 is:" + sw.Elapsed);


                    //    t.Join();

                        progress = 100;
                        //return database;
                    }
                    catch (Exception)
                    {
                        throw new Exception("Something went wrong");
                    }
                }


                donewithwork = true;


            }
            else MessageBox.Show("Your search did not return a match. Please search for something else.");
            progress = 0;
        }
    }

Should be pretty easy to do with multithreading and an AutoResetEvent . Code should look like this:

    // The AutoResetEvent is here to count time
    private AutoResetEvent event = new AutoResetEvent(false);

private YourMethod()
{
    Thread thread = new Thread(new ThreadStart(YourSearch));
    thread.Start();

    if (event.WaitOne(10000) == false)
    {
    // This should be reached only if the thread hasn't finished executing the search method after 10 seconds (10000 ms, you can change the parameter)
    // Show a message or whatever you want here, then abort thread:
    thread.Abort();
    }
}

Your search method should only have this in the end:

private void YourSearchMethod()
{
// Search whatever you want;
event.Set(); // Sets event (which triggers the WaitOne() call we used earlier)
}

im assuming this is in c#? Take a look at this

http://blogs.msdn.com/b/nikhil_agarwal/archive/2014/03/28/timeout-a-function-call-in-c.aspx

链接地址: http://www.djcxy.com/p/46576.html

上一篇: WPF绑定不从DispatcherTimer更新

下一篇: 执行搜索wpf时超时