[英]Best Practices: Adding a CLI to Existing Windows Service in .NET / Core
[英]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.