回答
肖恩說,你所要做的線程方法內所有異常處理和清理,你不能做它在線程初始化中。例如:
public void Run()
{
try
{
Thread thread1 = new Thread(ThreadEntry1);
thread1.Start();
Thread thread2 = new Thread(ThreadEntry2);
thread2.Start();
}
catch (NotImplementedException)
{
// Neither are caught here
Console.WriteLine("Caught you");
}
}
private void ThreadEntry1()
{
throw new NotImplementedException("Oops");
}
private void ThreadEntry2()
{
throw new NotImplementedException("Oops2");
}
相反,這種做法是比較獨立的,顯然也適用:
public void Run()
{
Thread thread1 = new Thread(ThreadEntry1);
thread1.Start();
}
private void ThreadEntry1()
{
try
{
throw new NotImplementedException("Oops");
}
catch (NotImplementedException)
{
Console.WriteLine("Ha! Caught you");
}
}
如果你想知道,如果線程已經失敗了,那麼你應該考慮的WaitHandles數組,併發回您的呼叫方法。另一種更簡單的方法是簡單地每個線程的操作完成時間遞增計數器:
Interlocked.Increment(ref _mycounter);
答:您有一個調用堆棧,你可以捕捉它的線程內和線程ID添加到我猜日誌...
如果你換你的線程在一個很好的方式,你可以添加將代碼清理到catch部分,如果需要,終止該線程。
如果你擔心這種事情,那麼你應該把你的線程入口點包裝在try/catch塊中,並且明確地進行清理。任何傳出線程入口點的異常都會導致應用程序關閉。
您無法使用默認設置捕獲.Net 3.5或更低版本中的ThreadAbortException,並且您無法捕獲.Net 4.0中可能代表損壞狀態的異常,並且也使用默認設置。 所以你不能使用默認設置捕捉try catch塊的所有異常(不建議你這麼做) – 2010-03-17 12:43:02
它不會拋出ThreadAbortException異常,除非你中止線程 - 也可以捕獲它們,但不能吞下它們因爲它們會自動重新升起 – 2010-03-17 12:49:24
@Chris S,你說得對+1,我用吞嚥的含義來捕捉,這在政治上是不正確的。 – 2010-03-19 09:18:51
您可以像在任何普通函數中那樣捕獲線程中的異常。 如果一個線程你的「工作」函數被調用的DoWork然後做這樣的事情:
private void DoWork(...args...)
{
try
{
// Do my thread work here
}
catch (Exception ex)
{
}
}
埃裏克利珀對在工作線程中發生異常的不良最近post。值得閱讀和理解的是,異常是「特殊的」,並且在工作線程中發生異常之後,您唯一可以確定的是,您無法再確定應用程序的狀態。
- 1. 在不同線程中捕獲異常
- 2. 從所有線程捕獲異常?
- 3. 無法捕獲TimerTask線程異常
- 4. 從另一個線程捕獲異常
- 5. 從其他線程捕獲異常?
- 6. 從運行線程捕獲異常
- 7. Ruby,捕獲庫線程異常?
- 8. 捕獲未處理的線程異常
- 9. 擺動線程捕獲異常
- 10. 用線程捕捉異常
- 11. .NET多線程和異常
- 12. 異步任務致命異常 - 線程正在退出,未捕獲的異常
- 13. 進程捕獲異常
- 14. Ruby Net-SFTP捕獲和日誌異常
- 15. 如何從.NET Web API捕獲異常
- 16. .NET異常捕獲意外地空
- 17. 爲什麼.net異常不被捕獲?
- 18. 在Display.syncExec過程中捕獲傳播異常以調用線程
- 19. 如何捕獲所有異常/崩潰在.NET應用程序
- 20. 捕獲異常
- 21. 捕獲異常
- 22. 捕獲異常
- 23. 異常捕獲
- 24. 如何在異常中捕獲異常?
- 25. 捕捉SOAP異常.NET
- 26. 正確捕捉異常.net
- 27. Java:在不同線程中捕獲異常
- 28. 在Elmah後臺線程中捕獲異常
- 29. 線程存在與未捕獲的異常
- 30. 如何在GUI線程中捕獲異常?
同意。我不認爲這是一個問題 - 你開始一個線程,它會進入你的一個方法......所以你不能在那裏處理異常呢? – TomTom 2010-03-17 10:27:25