2014-04-02 39 views
0

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

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

让我知道如果你需要我的代码和你需要看到的部分。

谢谢

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

欲设定时限这块

私人无效worker_DoWork(对象发件人,DoWorkEventArgs E) { 进展= 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. \r\n" + " " + 
          "Ø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; 
     } 
    } 

回答

1

应该是很容易做的多线程和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) 
}