您好,登錄后才能下訂單哦!
NetCore中怎么利用托管服務(wù)執(zhí)行后臺(tái)任務(wù),相信很多沒有經(jīng)驗(yàn)的人對(duì)此束手無策,為此本文總結(jié)了問題出現(xiàn)的原因和解決方法,通過這篇文章希望你能解決這個(gè)問題。
首先我們創(chuàng)建一個(gè)控制臺(tái)項(xiàng)目,下載基礎(chǔ)包
nuget install Microsoft.Extensions.Hosting
初始化Program.cs文件
public static class Program { static async void Main(string[] args) { var builder = new HostBuilder().ConfigureServices((context, service) => { }); await builder.RunConsoleAsync(); } }
注入后臺(tái)服務(wù)非常簡(jiǎn)單,調(diào)用service.AddHostedService
方法將自定義的服務(wù)進(jìn)行注入。
service.AddHostedService<CustomerJob/Service>();
自定義的后臺(tái)服務(wù)類需要滿足定義的接口,才可以被正常使用,下面我引用一個(gè)官方的案例進(jìn)行說明
定時(shí)后臺(tái)任務(wù)使用 [System.Threading.Timer]類。 計(jì)時(shí)器觸發(fā)任務(wù)的
DoWork
方法。 在StopAsync
上禁用計(jì)時(shí)器,并在Dispose
上處置服務(wù)容器時(shí)處置計(jì)時(shí)器:
繼承IHostedService
接口,實(shí)現(xiàn)StartAsync
和StopAsync
方法即可將服務(wù)正常注入后臺(tái)任務(wù)中。
IDisposable
的作用主要是在進(jìn)程關(guān)閉時(shí)釋放定時(shí)器資源
public class TimedHostedService : IHostedService, IDisposable { private int executionCount = 0; private readonly ILogger<TimedHostedService> _logger; private Timer _timer; 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(); } }
將上文中的內(nèi)容進(jìn)行一個(gè)整合,得到的效果是
public static class Program { static async void Main(string[] args) { var builder = new HostBuilder().ConfigureServices((context, service) => { service.AddHostedService<TimedHostedService>(); }); await builder.RunConsoleAsync(); } }
Ctrl+F5即可查看執(zhí)行效果
以上說明的是后臺(tái)任務(wù)在Core控制臺(tái)中的應(yīng)用,那么在AspNetCore【W(wǎng)eb項(xiàng)目】中是怎么使用的呢。當(dāng)然都是一樣的,只是注入的地方發(fā)生了小小的改變,在AspNetCore中注入通常發(fā)生在StartUp.cs
中的方法ConfigureServices
。使用方法和控制臺(tái)一致。
public void ConfigureServices(IServiceCollection services) { service.AddHostedService<TimedHostedService>(); }
適用于Web項(xiàng)目中涉及數(shù)據(jù)庫等外連接操作的場(chǎng)景,例如
每一次web請(qǐng)求對(duì)應(yīng)一個(gè)數(shù)據(jù)庫上下文[DbContext],這個(gè)時(shí)候就要用要帶作用域的服務(wù)。
帶作用域的服務(wù)使用也非常簡(jiǎn)單,可以參考官方文檔,這里我就不做其他介紹
看完上述內(nèi)容,你們掌握NetCore中怎么利用托管服務(wù)執(zhí)行后臺(tái)任務(wù)的方法了嗎?如果還想學(xué)到更多技能或想了解更多相關(guān)內(nèi)容,歡迎關(guān)注億速云行業(yè)資訊頻道,感謝各位的閱讀!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。