我想監視另一個線程的一個線程。當前正在查看threasd.isalive屬性。如果線程仍然有任何異常,則線程.isiveive屬性爲true。.net線程監視
我想如果在線程,或者如果線程處於無限循環的任何異常殺死線程..
會appreacite您輸入/解決方案/建議。
拉朱
我想監視另一個線程的一個線程。當前正在查看threasd.isalive屬性。如果線程仍然有任何異常,則線程.isiveive屬性爲true。.net線程監視
我想如果在線程,或者如果線程處於無限循環的任何異常殺死線程..
會appreacite您輸入/解決方案/建議。
拉朱
這聽起來像監視線程捕捉它拋出異常,否則將終止,可能把你的整個過程下來爲好。您可以訂閱AppDomain.FirstChanceException
事件以確定何時最初引發異常,但即使發生這種情況,您也不一定要終止線程(如果線程捕獲異常並進行處理並正常執行,該怎麼辦?) 。相反,考慮讓異常終止線程「正常」,然後將其捕獲到監視器代碼中,以防止它終止進程。
無法確定線程是否處於無限循環中,但是您可以終止運行時間過長的線程(請參閱下面的示例代碼)。然而,用Thread.Abort
強制終止線程可能會導致問題,並且是代碼異味(請參閱here)。您應該考慮更改工作線程以管理其自己的生命週期。
class Program
{
static void Main(string[] args)
{
if (RunWithTimeout(LongRunningOperation, TimeSpan.FromMilliseconds(3000)))
{
Console.WriteLine("Worker thread finished.");
}
else
{
Console.WriteLine("Worker thread was aborted.");
}
}
static bool RunWithTimeout(ThreadStart threadStart, TimeSpan timeout)
{
Thread workerThread = new Thread(threadStart);
workerThread.Start();
bool finished = workerThread.Join(timeout);
if (!finished)
workerThread.Abort();
return finished;
}
static void LongRunningOperation()
{
Thread.Sleep(5000);
}
}
通常這是過度設計的標誌。絕大多數程序根本不需要這個。
如果你真的需要檢測線程無限循環,那麼你應該構建線程的邏輯是在一個主循環,並讓它「簽入」到看門狗。主循環當然是無限的(除非線程被期望「完成」),但是它會捕獲嵌套在主循環中的任何無限循環。
問題是:這個「看門狗」是什麼?
它不能是同一AppDomain中的另一個線程。在這種情況下,Thread.Abort
線程完全不合適。
它可能是一個單獨的AppDomain中的線程。就個人而言,我並不完全滿意AppDomain回收過程中發生的「盡力但不保證」的清理,所以我完全避免了多個AppDomain。
它可能是一個過程。該解決方案在非常重要的自動化解決方案中非常常見
它也可能是另一臺電腦。該解決方案用於關鍵的自動化解決方案。我曾經做過的大部分工作都涉及每臺計算機上的監視程序進程以及提供一種熱備份故障轉移羣集的監視計算機。
不過,我可以誠實地說,98%的問題被問到,答案是「只要確保你不要在線程中放入一個無限循環。」換句話說,設計和實施看門狗解決方案的巨大成本根本不在實際需求的範圍內。設計和代碼評審以及良好的測試策略通常是最佳解決方案。