执行搜索wpf时超时

当我在我的应用程序中执行搜索时,我想要有一个超时函数,它给用户一条消息并在10秒后停止搜索。

这怎么可能? 你能告诉我那个代码吗?

如果您需要查看我的代码以及您需要查看的部分,请告诉我。

谢谢

你好! 这是守则。 忘了告诉你即时通讯使用背景工作者做你张贴的建议不会工作。

我想为这件作品设定一个时间限制

private void worker_DoWork(object sender,DoWorkEventArgs e){progress = 0; 秒表sw =新秒表(); 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;
        }
    }

使用多线程和AutoResetEvent应该很容易。 代码应该如下所示:

    // 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();
    }
}

你的搜索方法最终只能做到这一点:

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

即时通讯假设这是在C#? 看看这个

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

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

上一篇: Time out when executing a search wpf

下一篇: Connecting SQL Azure to Windows Phone 7 using WCF