执行搜索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