最新文章專題視頻專題問答1問答10問答100問答1000問答2000關(guān)鍵字專題1關(guān)鍵字專題50關(guān)鍵字專題500關(guān)鍵字專題1500TAG最新視頻文章推薦1 推薦3 推薦5 推薦7 推薦9 推薦11 推薦13 推薦15 推薦17 推薦19 推薦21 推薦23 推薦25 推薦27 推薦29 推薦31 推薦33 推薦35 推薦37視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關(guān)鍵字專題關(guān)鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
問答文章1 問答文章501 問答文章1001 問答文章1501 問答文章2001 問答文章2501 問答文章3001 問答文章3501 問答文章4001 問答文章4501 問答文章5001 問答文章5501 問答文章6001 問答文章6501 問答文章7001 問答文章7501 問答文章8001 問答文章8501 問答文章9001 問答文章9501
當(dāng)前位置: 首頁(yè) - 科技 - 知識(shí)百科 - 正文

一些.NET對(duì)多線程異常處理技巧分享

來源:懂視網(wǎng) 責(zé)編:小采 時(shí)間:2020-11-27 22:43:17
文檔

一些.NET對(duì)多線程異常處理技巧分享

一些.NET對(duì)多線程異常處理技巧分享:多線程環(huán)境 在我們的產(chǎn)品 SE 中,出現(xiàn)多線程的地方主要有兩大類,一類是通過 ThreadPool 或 new Thread 主動(dòng)發(fā)起多線程,另一類是 Socket 通訊回調(diào)。 多線程異常捕獲 對(duì)于一般的異常處理來說,我們只要簡(jiǎn)單的將可能出錯(cuò)的語(yǔ)句包含在 try/catch 語(yǔ)
推薦度:
導(dǎo)讀一些.NET對(duì)多線程異常處理技巧分享:多線程環(huán)境 在我們的產(chǎn)品 SE 中,出現(xiàn)多線程的地方主要有兩大類,一類是通過 ThreadPool 或 new Thread 主動(dòng)發(fā)起多線程,另一類是 Socket 通訊回調(diào)。 多線程異常捕獲 對(duì)于一般的異常處理來說,我們只要簡(jiǎn)單的將可能出錯(cuò)的語(yǔ)句包含在 try/catch 語(yǔ)

多線程環(huán)境
在我們的產(chǎn)品 SE 中,出現(xiàn)多線程的地方主要有兩大類,一類是通過 ThreadPool 或 new Thread 主動(dòng)發(fā)起多線程,另一類是 Socket 通訊回調(diào)。
多線程異常捕獲
對(duì)于一般的異常處理來說,我們只要簡(jiǎn)單的將可能出錯(cuò)的語(yǔ)句包含在 try/catch 語(yǔ)句中即可。我也曾經(jīng)簡(jiǎn)單的將該方法運(yùn)用于多線程的異常捕獲,結(jié)果并非如此,代碼如下:
代碼如下:


public static void Main()
{
    try
    {
        new Thread (Go).Start();
    }
    catch (Exception ex)
    {
        // 永遠(yuǎn)執(zhí)行不到這兒!
        Console.WriteLine ("Exception!");
    }
}
private static void Go()
{
    throw null;
}

正確的做法應(yīng)該是在新線程入口方法 Go 中捕獲異常:
代碼如下:

public static void Main()
{
    new Thread (Go).Start();
}
private static void Go()
{
    try
    {
        ...
        throw null; // 該異常將會(huì)被捕獲
        ...
    }
    catch (Exception ex)
    {
        // 異常日志記錄,或者通知其他線程出現(xiàn)異常了
        ...
    }
}

以上的正確做法來自 Threading in C# 中的小節(jié) Exception Handling,該文涉及到 .NET 多線程的方方面面,是我看到最全最好的文章。

正確捕獲多線程異常的方法找到了,接下來我們自然會(huì)想:是不是每個(gè)線程入口方法都得這么做?

且看 Threading in C# 中的小節(jié) Exception Handling 的描述:從 .NET 2.0 開始,任何一個(gè)線程上未處理的異常都會(huì)導(dǎo)致整個(gè)應(yīng)用程序關(guān)閉。因此,在每個(gè)線程入口方法中都必須要使用 try/catch 語(yǔ)句,至少在產(chǎn)品應(yīng)用程序中必須如此,以免應(yīng)用程序因?yàn)槲覀兾搭A(yù)料到的代碼而關(guān)閉整個(gè)應(yīng)用程序。

如果僅僅記下異常信息而不在乎應(yīng)用程序異常關(guān)閉,那么有兩個(gè)方法可以做到:

  1、對(duì)于 Windows Form 程序來說,有一個(gè)全局異常處理事件:Application.ThreadException;

  2、對(duì)于所有 .NET 程序來說,還有一個(gè)更低級(jí)的全局異常處理事件:AppDomain.UnhandledException;
更高的要求
我們能簡(jiǎn)單的通過全局異常處理事件來記錄錯(cuò)誤日志;如果保證不中斷應(yīng)用程序,也可以在每個(gè)線程入口方法中捕獲異常并記錄異常日志。有沒有辦法做到:既能捕獲異常且不中斷應(yīng)用程序,又能如全局異常處理事件那樣簡(jiǎn)單捕獲異常?
對(duì)于主動(dòng)創(chuàng)建的新線程,至少可以做到這一點(diǎn):
代碼如下:


public static class ThreadExecutor
{
    public static bool Execute(System.Threading.WaitCallback callback, object state)
    {
        try
        {
            return System.Threading.ThreadPool.QueueUserWorkItem(callback, state);
        }
        catch (Exception e)
        {
            // log the exception
        }
        return false;
    }
}

聲明:本網(wǎng)頁(yè)內(nèi)容旨在傳播知識(shí),若有侵權(quán)等問題請(qǐng)及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

文檔

一些.NET對(duì)多線程異常處理技巧分享

一些.NET對(duì)多線程異常處理技巧分享:多線程環(huán)境 在我們的產(chǎn)品 SE 中,出現(xiàn)多線程的地方主要有兩大類,一類是通過 ThreadPool 或 new Thread 主動(dòng)發(fā)起多線程,另一類是 Socket 通訊回調(diào)。 多線程異常捕獲 對(duì)于一般的異常處理來說,我們只要簡(jiǎn)單的將可能出錯(cuò)的語(yǔ)句包含在 try/catch 語(yǔ)
推薦度:
標(biāo)簽: 方法 處理 技巧
  • 熱門焦點(diǎn)

最新推薦

猜你喜歡

熱門推薦

專題
Top