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

C# 如何在执行下一行代码之前等待计时器完成,而不使线程进入睡眠状态?,c#,.net,C#,.net,我试图在我的应用程序中定时执行一些代码。我正在我的应用程序中创建多个线程,并试图让它们同时执行代码 我想知道是否有一种方法可以让我的线程等待计时器完成,然后继续执行下一段代码,而不让它进入睡眠状态?目前我正在这样做,但肯定还有另一种方法。有人能提供一些帮助吗 System.Timers.Timer _timer = new System.Timers.Timer(); _timer.Interval = (2000); _timer.Elapsed

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

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

        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
您可以使用以下方法实现更简洁的异步方法:

创建异步操作,主要是抽象线程模型。当您在一个标记为async的例程中时,wait关键字意味着等待它完成,然后运行。在上面的示例中,这一切都发生在执行线程之外。

您可以使用更干净的异步方法:


创建异步操作,主要是抽象线程模型。当您在一个标记为async的例程中时,wait关键字意味着等待它完成,然后运行。在上面的示例中,这一切都发生在您的执行线程之外。

您甚至不需要使用计时器,只需使用不会阻塞UI线程的功能即可


您甚至不需要使用计时器,只需使用不会阻塞UI线程的功能即可

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

一种基于多线程注释的方法是使用类

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

一种基于多线程注释的方法是使用类


假设你一定要这样做,你可以使用


如前所述,您最好使用另一个实现,如前面所述。

假设您绝对必须这样做,您可以使用


如前所述,您最好使用另一个实现,如上述实现。

这是Winforms,您担心UI线程吗?通常的做法是将@code放在单独的方法中调用我完成的委托@,然后在计时器委托中调用该方法。然后,如果需要从该方法调用另一段代码,请创建一个新的计时器,并将该块放入它自己的方法中。@ErikFunkenbusch,如果是UI线程,它可以返回运行消息泵,如果是线程池线程,它可以释放回池中以执行不同的任务。这两种情况是等待任务所允许的。延迟方法允许。@DanBryant-这两种情况都可能导致线程休眠。。。至少在另一个事件发生之前…这是Winforms,您是否担心UI线程,还是已经处理好了?通常的方法是将@code放置在单独的方法中,以调用我完成的委托@,并在计时器委托中调用该方法。然后,如果需要从该方法调用另一段代码,请创建一个新的计时器,并将该块放入它自己的方法中。@ErikFunkenbusch,如果是UI线程,它可以返回运行消息泵,如果是线程池线程,它可以释放回池中以执行不同的任务。这两种情况是等待任务所允许的。延迟方法允许。@DanBryant-这两种情况都可能导致线程休眠。。。至少在另一个事件发生之前……代码向您建议他们使用支持async/await的.NET版本如何?代码向您建议他们使用支持async/await的.NET版本如何?
Task.Run(async delegate 
{ 
   await Task.Delay(2000); 
   //do stuff here
});
private async void SomeMethod()
{
    await Task.Delay(2000); // wait two seconds asynchronously
    // your code goes here
    // this code will be executed after two seconds
}
 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.
 }