簡體   English   中英

在執行下一行代碼之前,如何在不使線程進入睡眠狀態的情況下等待計時器完成?

[英]How can I wait for a timer to finished before I execute next line of code without putting the thread to sleep?

我試圖在我的應用程序中定時執行某些代碼。 我正在應用程序中創建多個線程,並且試圖使它們同時執行代碼。

我想知道是否有一種方法可以讓我的線程等待我的計時器完成,然后再繼續執行下一段代碼而不會使其進入睡眠狀態? 目前,我正在這樣做,但是肯定有另一種方法。 誰能提供幫助?

        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

您可以將Task.Delay用作 Task.Delay異步方法

Task.Run(async delegate 
{ 
   await Task.Delay(2000); 
   //do stuff here
});

Task創建異步操作,並且(大部分)抽象出線程模型。 當您位於標記為async的例程中時, await關鍵字的意思是“等待此過程完成然后運行”。 在上面的示例中,這都是在您正在執行的線程之外發生的。

您甚至不需要使用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
}

我試圖在我的應用程序中定時執行某些代碼。 我正在應用程序中創建多個線程,並且試圖使它們同時執行代碼。

一種方法(基於您的多線程注釋)是使用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.
 }

假設您絕對必須這樣做,則可以使用EventWaitHandle

如前所述,您最好使用上述的其他實現。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM