Dot-Net

在 .NET 中的 Azure 輔助角色中使用 Thread.Sleep 或 Timer?

  • March 6, 2012

我知道在 Windows 服務中,最好使用Timer而不是Thread.Sleep(timeout). 但是,在我可以在 Internet 上找到的所有處理 Azure 工作者的程式碼範例中,Thread.Sleep(timeout)使用的是它而不是Timer.

甚至 Visual Studio 的 Worker 項目模板中提供的預設程式碼也使用Thread.Sleep:

public class WorkerRole : RoleEntryPoint
{
   public override void Run()
   {
       // This is a sample worker implementation. Replace with your logic.
       Trace.WriteLine("$projectname$ entry point called", "Information");

       while (true)
       {
           Thread.Sleep(10000);
           Trace.WriteLine("Working", "Information");
       }
   }
// ...
}

到目前為止,我也一直Thread.Sleep在我的工人中使用,但沒有真正理解為什麼。所以我的問題是,為什麼Thread.Sleep(timeout)在 Azure 工作者角色中使用而不是Timer?Windows 服務和 Azure 工作者之間的區別是什麼導致了我們應該如何構思這種應用程序的這種差異?Timer在 Azure 工作者中使用是好是壞?

歡迎任何帶有一些資源連結的解釋來解釋其基本原理,因為到目前為止我找不到任何東西。

循環的目的Thread.Sleep()是防止Run()方法退出。如果Run()退出,那麼您的工作人員將重新啟動。我不知道您是否可以使用計時器有效地實現該目標。

您的 CPU 很可能每 1000 毫秒浪費一點時間來喚醒該執行緒,以便什麼都不做。我懷疑這很重要,但它也困擾著我。我的解決方案是改為等待 CancellationToken。

public class WorkerRole : RoleEntryPoint {
   CancellationTokenSource cancelSource = new CancellationTokenSource();

   public override void Run()
   {
       //do stuff
       cancelSource.Token.WaitHandle.WaitOne();
   }

   public override void OnStop()
   {
       cancelSource.Cancel();
   }
}

這可以防止 Run() 方法退出,而不會在忙等待時浪費 CPU 時間。您還可以在程序的其他地方使用 CancellationToken 來啟動您可能需要執行的任何其他關閉操作。

引用自:https://stackoverflow.com/questions/9561746