在执行下一行代码而不让线程进入休眠状态之前,如何等待计时器完成?

时间:2014-04-29 18:56:12

标签: c# .net

我正在尝试在我的应用程序中定时执行某些代码。我在我的应用程序中创建多个线程,我试图让它们同时执行代码。

我想知道是否有办法使我的线程等到我的计时器完成后继续使用下一位代码而不让它进入睡眠状态?目前我正在这样做,但肯定还有另一种方式。有人可以提供一些帮助吗?

        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

4 个答案:

答案 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

如前所述,您可能最好使用其他实施方式,例如提到的那些。