簡體   English   中英

捕獲.NET線程中的異常

[英]Catching Exceptions in a .NET Thread

你怎么能發現 MultiThreaded應用程序中的Thread中發生了Exception 並連續清理資源?

因為否則Thread仍然可以保留在內存中並運行。

正如Sean所說,你必須在線程方法中進行所有異常處理和清理,你不能在Thread初始化中做到這一點。 例如:

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);

如果你擔心這種事情,那么你應該將你的線程入口點包裝在try / catch塊中並明確地進行清理。 傳遞出線程入口點的任何異常都將導致您的應用程序關閉。

答:你有一個調用堆棧,你可以在線程中捕獲它並將線程id添加到日志中我猜...

如果以良好的方式包裝線程,則可以將清除代碼添加到catch部分,如果需要則終止線程。

你可以捕獲線程中的異常,就像你正常的函數一樣。 如果一個線程的“工作”函數被稱為DoWork,那么執行以下操作:

private void DoWork(...args...)
{
try
{
// Do my thread work here
}
catch (Exception ex)
{
}
}

Eric Lippert最近發表了關於工作線程中出現異常的不良情況的帖子 值得閱讀和理解異常是“例外”,並且在工作線程中的異常之后,您唯一可以確定的是您無法再確定應用程序的狀態。

暫無
暫無

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

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