我正在尝试在我的应用程序中定时执行某些代码。我在我的应用程序中创建多个线程,我试图让它们同时执行代码。
我想知道是否有办法使我的线程等到我的计时器完成后继续使用下一位代码而不让它进入睡眠状态?目前我正在这样做,但肯定还有另一种方式。有人可以提供一些帮助吗?
System.Timers.Timer _timer = new System.Timers.Timer();
_timer.Interval = (2000);
_timer.Elapsed += (sender, e) =>
{
//code to execute
_timer.Enabled = false;
};
_timer.Enabled = true;
Thread.Sleep(2000);
//code to invoke my finished delegate
答案 0 :(得分:3)
您可以使用 Task.Delay
获取更干净的异步方法:
Task.Run(async delegate
{
await Task.Delay(2000);
//do stuff here
});
Task
创建异步操作,并且(大部分)抽象出线程模型。当您进入标记为async
的例程时,await
关键字表示“等待此操作完成然后再运行”。在上面的示例中,这一切都发生在执行线程之外。
答案 1 :(得分:2)
您甚至不需要使用Timer
,只需使用async/await
功能,这不会阻止您的UI
线程
private async void SomeMethod()
{
await Task.Delay(2000); // wait two seconds asynchronously
// your code goes here
// this code will be executed after two seconds
}
答案 2 :(得分:0)
我正在尝试在我的应用程序中定时执行某些代码。我正在我的应用程序中创建多个线程,我试图让它们同时执行代码。
一种方法(根据您的多线程评论)是使用CountDownEvent类。
using (var mySignal = new CountDownEvent(doWorks.Count))
{
foreach (var doWork in doWorks)
{
// Start Threads example
Task.Factory.StartNew(() =>
{
// do work
// signal this thread done
mySignal.Signal();
}
}
// wait for all threads
mySignal.Wait();
// All threads are done.
}
答案 3 :(得分:0)
假设你绝对必须这样做,你可以使用EventWaitHandle
如前所述,您可能最好使用其他实施方式,例如提到的那些。