捕獲 BackgroundService 中的異常 | 學學官方是如何實現的

前言

上次,我們實現了《使用“裝飾者模式”捕獲 BackgroundService 中的異常》。

結果發現,微軟已經發現了這個問題,并在 .NET 6 中解決了。(囧)

a1c412e252fbbb1e8bb4c3b5961951c0.png

讓我們驗證一下:

using?IHost?host?=?Host.CreateDefaultBuilder(args).ConfigureServices(services?=>{services.AddHostedService<DemoBackgroundService>();}).Build();await?host.RunAsync();public?class?DemoBackgroundService?:?BackgroundService
{protected?override?async?Task?ExecuteAsync(CancellationToken?stoppingToken){Console.WriteLine("DemoBackgroundService.ExecuteAsync");await?Task.Delay(5000);throw?new?Exception("DemoBackgroundService?throw?Exception");}
}

確實會拋出異常并終止程序:

8c1aecfc3abe8ca7d91ed2d9ccca5add.png

那現在讓我們學習下,微軟官方是如何實現的,對我們以后處理類似問題可以起到借鑒作用。

實現代碼

通過查看提交歷史[1]。我們發現如下修改:

BackgroundService

BackgroundService[2] 并沒有較大修改,只是將 _executingTask 改名為 _executeTask,并暴露出去:

///?<summary>
///?Gets?the?Task?that?executes?the?background?operation.
///?</summary>
///?<remarks>
///?Will?return?<see?langword="null"/>?if?the?background?operation?hasn't?started.
///?</remarks>
public?virtual?Task?ExecuteTask?=>?_executeTask;

Host

關鍵改動是在 Host[3]

原來是僅僅啟動了 IHostedService:

foreach?(IHostedService?hostedService?in?_hostedServices)
{//?Fire?IHostedService.Startawait?hostedService.StartAsync(combinedCancellationToken).ConfigureAwait(false);
}

現在在啟動了 IHostedService 后,還會對 BackgroundService.ExecuteTask 進行try-catch:

foreach?(IHostedService?hostedService?in?_hostedServices)
{//?Fire?IHostedService.Startawait?hostedService.StartAsync(combinedCancellationToken).ConfigureAwait(false);if?(hostedService?is?BackgroundService?backgroundService){_?=?TryExecuteBackgroundServiceAsync(backgroundService);}
}private?async?Task?TryExecuteBackgroundServiceAsync(BackgroundService?backgroundService)
{Task?backgroundTask?=?backgroundService.ExecuteTask;...try{await?backgroundTask.ConfigureAwait(false);}catch?(Exception?ex){...if?(_options.BackgroundServiceExceptionBehavior?==?BackgroundServiceExceptionBehavior.StopHost){_logger.BackgroundServiceStoppingHost(ex);_applicationLifetime.StopApplication();}}
}

關鍵之處在于,執行TryExecuteBackgroundServiceAsync時并沒有加上await,也就不會阻塞后續代碼的執行;但在方法內部使用了await?backgroundTask等待 ExecuteTask 執行完成。所以當?ExecuteTask?出錯時,能夠截獲錯誤并執行終止當前應用程序操作。

參考資料

[1]

提交歷史: https://github.com/dotnet/runtime/pull/50569/files#diff-47e4bfc6ce357641a2b2f5e94e6981fb5ceadcb8e22d67060564b5ed5f44ceb0

[2]

BackgroundService: https://github.com/dotnet/runtime/blob/v6.0.0/src/libraries/Microsoft.Extensions.Hosting.Abstractions/src/BackgroundService.cs

[3]

Host: https://github.com/dotnet/runtime/blob/v6.0.0/src/libraries/Microsoft.Extensions.Hosting/src/Internal/Host.cs

添加微信號【MyIO666】,邀你加入技術交流群

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/282978.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/282978.shtml
英文地址,請注明出處:http://en.pswp.cn/news/282978.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

使用badboy錄制腳本 結合Jmeter一起測試。

1.badboy介紹 Badboy是一款不錯的Web自動化測試工具&#xff0c;如果你將它用于非商業用途&#xff0c;或者用于商業用途安裝Badboy 的機器數量不超過5臺&#xff0c;你是不需要為它支付任何費用的。Badboy提供了將Web測試腳本直接導出生成JMeter 腳本的功能&#xff0c;并且這…

centOS下安裝jdk1.8

2019獨角獸企業重金招聘Python工程師標準>>> 本文記錄了在vm下安裝的centOS7下安裝jdk1.8的過程 需要的工具及jdk&#xff1a; jdk-8u171-linux-x64.tar.gz 可以到官網去下 cecureFX 用于文件的傳輸 過程&#xff1a; 本次centOS7使用VMware Workstation 14 P…

php判斷是否是文件_PHP判斷文件是否為圖片文件的方法總結

近日在做圖片處理方面的開發&#xff0c;看著這一片不錯的文章&#xff0c;分享給大家。在網頁設計中&#xff0c;如果需要圖片&#xff0c;我們通常拿到的是一個圖片的文件名。僅僅通過文件名是無法判斷該文件是否是一個圖片文件的。或許有的人以為通過后綴名就可以判斷&#…

盤點大廠的那些開源項目 - 滴滴出行

滴滴出行是涵蓋出租車、 專車、滴滴快車、 順風車、代駕及大巴、貨運等多項業務在內的一站式出行平臺。Nightingale 夜鶯分類&#xff1a;監控系統夜鶯是一套分布式高可用的運維監控系統&#xff0c;最大的特點是混合云支持&#xff0c;既可以支持傳統物理機虛擬機的場景&#…

oracle 基本異常的練習及各個錯誤碼

DECLAREv_deptno emp.deptno%TYPE :&deptno;v_sal emp.sal%TYPE;v_empno emp.empno%TYPE; BEGINSELECT sal INTO v_sal FROM emp WHERE deptno v_deptno;IF v_sal<1500 THEN UPDATE emp SET salsal100 WHERE empno v_empno; DBMS_OUTPUT.PUT_LINE(編碼為||v_empno…

阿里巴巴發布智能運維故障管理AI+生態計劃

摘要&#xff1a; 為響應馬老師“家國情懷&#xff0c;世界擔當”的號召&#xff0c;開放“AI”生態計劃&#xff0c;將讓集團內部服務過程中積累下的技術與經驗更好地回饋社會&#xff0c;任何企業或合作伙伴均可以簡單方便的接入阿里巴巴智能故障管理平臺&#xff0c;通過對接…

tomcat 插件

1. http://www.eclipsetotale.com/tomcatPlugin.html

PHP使用for循環打出星號表格,console - JavaScript中,使用for循環輸出如下圖形(等腰三角形,和平行四邊形)?原理是啥?...

小皮2017-04-11 13:13:591樓以下代碼用了ES6,取名比較隨意s就是space,空格的意思,n是要總次數,第二個參數是輸出的圖形第一個很簡單,累加就好了//ES6function first(n,print "*"){for(let i 0; i < n ;i)console.log(i > 0 ? print.repeat(i 1) : print);}…

k8s 讀書筆記 - Pod 的升級和回滾

Pod 升級可能面臨的問題當集群中的某個服務需要升級時&#xff0c;我們需要停止目前與該服務相關的所有 Pod&#xff0c;然后下載新版本鏡像并創建新的 Pod。但是當集群規模比較龐大時&#xff0c;那么這個工作就會變成一個挑戰&#xff0c;而且先全部停止然后再逐步升級的方式…

WeakHashMap和Java引用類型詳細解析

WeakHashMap是種弱引用的HashMap&#xff0c;這是說&#xff0c;WeakHashMap里的key值如果沒有外部強引用&#xff0c;在垃圾回收之后&#xff0c;WeakHashMap的對應內容也會被移除掉。 1.1 Java的引用類型 在講解WeakHashMap之前&#xff0c;我們需要了解Java中引用的相關類&…

KVOController代碼分析和踩坑

KVOController是FaceBook的一個開源庫&#xff0c;提供了方便的姿勢讓你去使用KVO。 github.com/facebook/KV… 大概的用法如下&#xff1a; [self.KVOController observe:target keyPath:keyPath options:NSKeyValueObservingOptionNew block:^(id observer, id object, NSDic…

java中compareto方法詳解,Java中compareTo()方法的詳解

例如&#xff1a;String a "abc";String b "abc";System.out.println("num "a.compareTo(b));a是String類型的字符串,它的比較用compareTo方法,它從第一位開始比較, 如果遇到不同的字符,則馬上返回這兩個字符的ascii值差值.返回值是int類型1.…

《ASP.NET Core 6框架揭秘》實例演示[21]:如何承載你的后臺服務

借助 .NET提供的服務承載&#xff08;Hosting&#xff09;系統&#xff0c;我們可以將一個或者多個長時間運行的后臺服務寄宿或者承載我們創建的應用中。任何需要在后臺長時間運行的操作都可以定義成標準化的服務并利用該系統來承載&#xff0c;ASP.NET Core應用最終也體現為這…

使用DBCA工具創建自己的數據庫

ylbtech-Oracle&#xff1a;使用DBCA工具創建自己的數據庫 DBCA創建數據庫 默認安裝的Oracle數據庫一般不能滿足實際應用的需求&#xff0c;例如數據庫名稱、數據庫塊的大小等都需要修改&#xff0c;那么我們應該自己創建一個滿足實際應用系統需要的Oracle數據實例&#xff08;…

免去架構算法調優,如何讓你的系統風馳電掣?|圖說

通用計算場景下的云服務器領域從來都是兵家必爭之地&#xff0c;價格戰曾打了一波又一波&#xff0c;可用戶痛點卻依然是“頑疾”。由于采用的基礎硬件、架構和調優技術千差萬別&#xff0c;類似配置的云服務器之間存有較大的性能差異。 但市面上五花八門的云服務器不絕于耳&am…

PHP URL的處理函數,php中url處理函數總結

在php中url處理函數有很多,如有:http_build_query,compact,urldecode、urlencode,parse_url,rawurldecode等等函數。http_build_query(PHP 5) http_build_query — 生成 URL-encode 之后的請求字符串,實例代碼如下:$dataarray(foo>bar,baz>boom,cow>milk,php>hyper…

記一次 .NET 某數控機床控制程序 卡死分析

一&#xff1a;背景 1. 講故事前段時間有位朋友微信上找到我&#xff0c;說它的程序出現了卡死&#xff0c;讓我幫忙看下是怎么回事&#xff1f; 說來也奇怪&#xff0c;那段時間求助卡死類的dump特別多&#xff0c;被迫訓練了一下對這類問題的洞察力 &#x1f604;&#x1f60…

TODO-MVP-Loaders源碼體驗

大家好&#xff0c;我是蒼王。以下是我這個系列的相關文章&#xff0c;有興趣可以參考一下&#xff0c;可以給個喜歡或者關注我的文章。[Android]如何做一個崩潰率少于千分之三噶應用app--章節列表相信有關注我的人&#xff0c;都會看過我上一編介紹的Todo-mvp源碼體驗&#xf…

.NET Framework 4.8預覽

雖然人們的大多數關注點都在.NET Core上&#xff0c;但經典的.NET Framework仍然在開發中。.NET 4.8的“早期訪問”預覽版表明了微軟最關心的領域包括高DIP、可訪問性和并發性。\\.NET 4.8預計將于2019年發布。目前的預期是&#xff0c;它將在稍后的Windows 10 build 1607上運行…

java項目商品的排名,分析了5萬個開源項目,得出的排名前16的Java工具類

原文:https://www.jianshu.com/p/9e937d178203在Java中&#xff0c;工具類定義了一組公共方法&#xff0c;這篇文章將介紹Java中使用最頻繁及最通用的Java工具類。以下工具類、方法按使用流行度排名&#xff0c;參考數據來源于Github上隨機選取的5萬個開源項目源碼。一. org.ap…