這篇文章主要介紹了.NET多線(xiàn)程異常如何處理,具有一定借鑒價(jià)值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。
10年積累的成都網(wǎng)站建設(shè)、網(wǎng)站設(shè)計(jì)經(jīng)驗(yàn),可以快速應(yīng)對(duì)客戶(hù)對(duì)網(wǎng)站的新想法和需求。提供各種問(wèn)題對(duì)應(yīng)的解決方案。讓選擇我們的客戶(hù)得到更好、更有力的網(wǎng)絡(luò)服務(wù)。我雖然不認(rèn)識(shí)你,你也不認(rèn)識(shí)我。但先網(wǎng)站設(shè)計(jì)后付款的網(wǎng)站建設(shè)流程,更有富裕免費(fèi)網(wǎng)站建設(shè)讓你可以放心的選擇與我們合作。
多線(xiàn)程應(yīng)用,在實(shí)際的項(xiàng)目或產(chǎn)品開(kāi)發(fā)中,原則上來(lái)說(shuō),應(yīng)該盡量避免(這是我一家之言,因?yàn)槲也皇且粋€(gè)一心可多用的人 )。但是在強(qiáng)調(diào)用戶(hù)體驗(yàn)的要求下或開(kāi)發(fā)平臺(tái)的限制下(如 Silverlight Socket 通訊),我們不得不用多線(xiàn)程。
多線(xiàn)程環(huán)境
在我們的產(chǎn)品 SE 中,出現(xiàn)多線(xiàn)程的地方主要有兩大類(lèi),一類(lèi)是通過(guò) ThreadPool 或 new Thread 主動(dòng)發(fā)起多線(xiàn)程,另一類(lèi)是 Socket 通訊回調(diào)。
多線(xiàn)程異常捕獲
對(duì)于一般的異常處理來(lái)說(shuō),我們只要簡(jiǎn)單的將可能出錯(cuò)的語(yǔ)句包含在 try/catch 語(yǔ)句中即可。我也曾經(jīng)簡(jiǎn)單的將該方法運(yùn)用于多線(xià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)該是在新線(xiàn)程入口方法 Go 中捕獲異常:
public static void Main() { new Thread (Go).Start(); } private static void Go() { try { ... throw null; // 該異常將會(huì)被捕獲 ... } catch (Exception ex) { // 異常日志記錄,或者通知其他線(xiàn)程出現(xiàn)異常了 ... } }
以上的正確做法來(lái)自 Threading in C# 中的小節(jié) Exception Handling,該文涉及到 .NET 多線(xiàn)程的方方面面,是我看到最全***的文章。
正確捕獲多線(xiàn)程異常的方法找到了,接下來(lái)我們自然會(huì)想:是不是每個(gè)線(xiàn)程入口方法都得這么做?
且看 Threading in C# 中的小節(jié) Exception Handling 的描述:從 .NET 2.0 開(kāi)始,任何一個(gè)線(xiàn)程上未處理的異常都會(huì)導(dǎo)致整個(gè)應(yīng)用程序關(guān)閉。因此,在每個(gè)線(xiàn)程入口方法中都必須要使用 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 程序來(lái)說(shuō),有一個(gè)全局異常處理事件:Application.ThreadException;
2、對(duì)于所有 .NET 程序來(lái)說(shuō),還有一個(gè)更低級(jí)的全局異常處理事件:AppDomain.UnhandledException;
更高的要求
我們能簡(jiǎn)單的通過(guò)全局異常處理事件來(lái)記錄錯(cuò)誤日志;如果保證不中斷應(yīng)用程序,也可以在每個(gè)線(xiàn)程入口方法中捕獲異常并記錄異常日志。有沒(méi)有辦法做到:既能捕獲異常且不中斷應(yīng)用程序,又能如全局異常處理事件那樣簡(jiǎn)單捕獲異常?
對(duì)于主動(dòng)創(chuàng)建的新線(xiàn)程,至少可以做到這一點(diǎn):
public static class ThreadExecutor { public static bool Execute(System.Threading.WaitCallback callback, object state) { try { return System.Threading.ThreadPool.QueueUserWorkItem((data) => { try { callback(data); } catch (exception ex) { // log the exception } }, state); } catch (Exception e) { // log the exception } return false; } }
感謝你能夠認(rèn)真閱讀完這篇文章,希望小編分享的“.NET多線(xiàn)程異常如何處理”這篇文章對(duì)大家有幫助,同時(shí)也希望大家多多支持創(chuàng)新互聯(lián),關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,更多相關(guān)知識(shí)等著你來(lái)學(xué)習(xí)!
文章名稱(chēng):.NET多線(xiàn)程異常如何處理
URL標(biāo)題:http://aaarwkj.com/article4/jjgjoe.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供品牌網(wǎng)站設(shè)計(jì)、網(wǎng)站營(yíng)銷(xiāo)、網(wǎng)站排名、網(wǎng)站維護(hù)、網(wǎng)站內(nèi)鏈、App設(shè)計(jì)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶(hù)投稿、用戶(hù)轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話(huà):028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)