日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > asp.net >内容正文

asp.net

在 ASP.NET Core 中使用托管服务实现后台任务

發(fā)布時間:2023/12/4 asp.net 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 在 ASP.NET Core 中使用托管服务实现后台任务 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

在 ASP.NET Core 中,后臺任務(wù)作為托管服務(wù)實(shí)現(xiàn)。托管服務(wù)是一個類,具有實(shí)現(xiàn) IHostedService 接口的后臺任務(wù)邏輯。

ASP.NET Core 輔助角色服務(wù)模板可作為編寫長期服務(wù)應(yīng)用的起點(diǎn)。通過輔助角色服務(wù)模板創(chuàng)建的應(yīng)用將在其項(xiàng)目文件中指定 Worker SDK:

<Project?Sdk="Microsoft.NET.Sdk.Worker">

要使用該模板作為編寫托管服務(wù)應(yīng)用的基礎(chǔ):

創(chuàng)建新項(xiàng)目。

選擇“輔助角色服務(wù)”。選擇“下一步”。

在“項(xiàng)目名稱”字段提供項(xiàng)目名稱,或接受默認(rèn)項(xiàng)目名稱。選擇“下一頁”。

在“其他信息”對話框中,選擇“框架” 。選擇“創(chuàng)建”。

Package

基于輔助角色服務(wù)模板的應(yīng)用使用 Microsoft.NET.Sdk.Worker SDK,并且具有對 Microsoft.Extensions.Hosting 包的顯式包引用。有關(guān)示例,請參閱示例應(yīng)用的項(xiàng)目文件 (BackgroundTasksSample.csproj)。

對于使用 Microsoft.NET.Sdk.Web SDK 的 Web 應(yīng)用,通過共享框架隱式引用 Microsoft.Extensions.Hosting 包。在應(yīng)用的項(xiàng)目文件中不需要顯式包引用。

IHostedService 接口

IHostedService 接口為主機(jī)托管的對象定義了兩種方法:

StartAsync(CancellationToken) StopAsync(CancellationToken)

StartAsync

StartAsync 包含啟動后臺任務(wù)的邏輯。在以下操作之前調(diào)用 StartAsync:

已配置應(yīng)用的請求處理管道。

已啟動服務(wù)器且已觸發(fā) IApplicationLifetime.ApplicationStarted。可以更改默認(rèn)行為,以便在配置應(yīng)用的管道并調(diào)用 ApplicationStarted 之后,運(yùn)行托管服務(wù)的 StartAsync。若要更改默認(rèn)行為,請?jiān)谡{(diào)用 CreateBuilder 后添加托管服務(wù)(以下示例中的 VideosWatcher):

var?builder?=?WebApplication.CreateBuilder(args);//?Add?services?to?the?container. builder.Services.AddHostedService<VideosWatcher>();}

StopAsync

StopAsync(CancellationToken) 在主機(jī)執(zhí)行正常關(guān)閉時觸發(fā)。StopAsync 包含結(jié)束后臺任務(wù)的邏輯。實(shí)現(xiàn) IDisposable 和終結(jié)器(析構(gòu)函數(shù))以處置任何非托管資源。

默認(rèn)情況下,取消令牌會有五秒超時,以指示關(guān)閉進(jìn)程不再正常。在令牌上請求取消時:

應(yīng)中止應(yīng)用正在執(zhí)行的任何剩余后臺操作。

StopAsync 中調(diào)用的任何方法都應(yīng)及時返回。

但是,在請求取消后,將不會放棄任務(wù) — 調(diào)用方等待所有任務(wù)完成。

如果應(yīng)用意外關(guān)閉(例如,應(yīng)用的進(jìn)程失敗),則可能不會調(diào)用 StopAsync。因此,在 StopAsync 中執(zhí)行的任何方法或操作都可能不會發(fā)生。

若要延長默認(rèn)值為 5 秒的關(guān)閉超時值,請?jiān)O(shè)置:

ShutdownTimeout(當(dāng)使用通用主機(jī)時)。有關(guān)詳細(xì)信息,請參閱 ASP.NET Core 中的 .NET 通用主機(jī)。使用 Web 主機(jī)時為關(guān)閉超時值主機(jī)配置設(shè)置。有關(guān)詳細(xì)信息,請參閱 ASP.NET Core Web 主機(jī)。托管服務(wù)在應(yīng)用啟動時激活一次,在應(yīng)用關(guān)閉時正常關(guān)閉。如果在執(zhí)行后臺任務(wù)期間引發(fā)錯誤,即使未調(diào)用 StopAsync,也應(yīng)調(diào)用 Dispose。

BackgroundService 基類

BackgroundService 是用于實(shí)現(xiàn)長時間運(yùn)行的 IHostedService 的基類。

調(diào)用 ExecuteAsync(CancellationToken) 來運(yùn)行后臺服務(wù)。實(shí)現(xiàn)返回一個 Task,其表示后臺服務(wù)的整個生存期。在 ExecuteAsync 變?yōu)楫惒?#xff08;例如通過調(diào)用 await)之前,不會啟動任何其他服務(wù)。避免在 ExecuteAsync 中執(zhí)行長時間的阻塞初始化工作。StopAsync(CancellationToken) 中的主機(jī)塊等待完成 ExecuteAsync。

調(diào)用 IHostedService.StopAsync 時,將觸發(fā)取消令牌。當(dāng)激發(fā)取消令牌以便正常關(guān)閉服務(wù)時,ExecuteAsync 的實(shí)現(xiàn)應(yīng)立即完成。否則,服務(wù)將在關(guān)閉超時后不正常關(guān)閉。有關(guān)更多信息,請參閱 IHostedService interface 部分。

StartAsync 應(yīng)僅限于短期任務(wù),因?yàn)橥泄芊?wù)是按順序運(yùn)行的,在 StartAsync 運(yùn)行完成之前不會啟動其他服務(wù)。長期任務(wù)應(yīng)放置在 ExecuteAsync 中。有關(guān)詳細(xì)信息,請參閱 BackgroundService 數(shù)據(jù)源。

計(jì)時的后臺任務(wù)

定時后臺任務(wù)使用 System.Threading.Timer 類。計(jì)時器觸發(fā)任務(wù)的 DoWork 方法。在 StopAsync 上禁用計(jì)時器,并在 Dispose 上處置服務(wù)容器時處置計(jì)時器:

public?class?TimedHostedService?:?IHostedService,?IDisposable {private?int?executionCount?=?0;private?readonly?ILogger<TimedHostedService>?_logger;private?Timer?_timer?=?null!;public?TimedHostedService(ILogger<TimedHostedService>?logger){_logger?=?logger;}public?Task?StartAsync(CancellationToken?stoppingToken){_logger.LogInformation("Timed?Hosted?Service?running.");_timer?=?new?Timer(DoWork,?null,?TimeSpan.Zero,?TimeSpan.FromSeconds(5));return?Task.CompletedTask;}private?void?DoWork(object??state){var?count?=?Interlocked.Increment(ref?executionCount);_logger.LogInformation("Timed?Hosted?Service?is?working.?Count:?{Count}",?count);}public?Task?StopAsync(CancellationToken?stoppingToken){_logger.LogInformation("Timed?Hosted?Service?is?stopping.");_timer?.Change(Timeout.Infinite,?0);return?Task.CompletedTask;}public?void?Dispose(){_timer?.Dispose();} }

Timer 不等待先前的 DoWork 執(zhí)行完成,因此所介紹的方法可能并不適用于所有場景。使用 Interlocked.Increment 以原子操作的形式將執(zhí)行計(jì)數(shù)器遞增,這可確保多個線程不會并行更新 executionCount。

已使用 AddHostedService 擴(kuò)展方法在 IHostBuilder.ConfigureServices (Program.cs) 中注冊該服務(wù):

services.AddHostedService<TimedHostedService>();

總結(jié)

以上是生活随笔為你收集整理的在 ASP.NET Core 中使用托管服务实现后台任务的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。