簡體   English   中英

在.net Windows Service中處理無效工作線程的最佳實踐?

[英]Best Practices for dealing with dead worker threads in a .net Windows Service?

我編寫了一個小的Windows服務,該服務定期執行任務。 似乎工作正常,但我有一個擔憂。

OnStart方法啟動一個“工作線程”,該線程負責執行任務,等待時間間隔並重復任務。

在“管理工具”的“ Windows服務”部分中,可以對其進行設置,以便該服務在失敗時自動重新啟動。

但是,在輔助線程引發異常的情況下,該服務似乎可以繼續運行。 我認為,如果工作線程引發異常,則應將服務視為已停止,並且Windows應采用服務設置中指定的異常。

實現此目的的最佳做法是什么?

在我們的例子中,我們不希望單個任務導致服務崩潰(因為也許只是壞數據,其他所有任務都可以正常完成),所以我們只是將所有輔助邏輯包裝在try/catch並記錄任何我們打的例外。 我確實有一些異常跟蹤代碼,如果它始終失敗(例如,網絡或數據庫已關閉),它將關閉服務。

但是,如果您的服務僅執行一項任務,而失敗則是停止所有操作的良好原因,那么我認為編寫代碼將異常封送回主線程是可行的。 您可以在啟動服務時保存SynchronizationContext.Current ,並在遇到異常時使用它返回主線程。 我相信這就是停止(停止,崩潰)該服務。 如果代碼不太正確,請原諒。 我目前沒有VS。

void OnStart()
{
  _mainThread = SynchronizationContext.Current();
}

void DoWork()
{
  try
  {
    // Do the stuff...
  }
  catch (Exception e)
  {
    _mainThread.Post(() => Throw);
  }
}

編輯:

再次考慮,我認為您可以完成您想要的工作...簡單:)

(在Ishmaeel的注釋中建議使用Environment.Exit而不是Stop

void DoWork()
{
  try
  {
    // Do the stuff...
  }
  catch (Exception e)
  {
    LogException(e);
    Environment.Exit(1);
  }
}

暫無
暫無

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

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