NetCore中怎么利用托管服務執行后臺任務,相信很多沒有經驗的人對此束手無策,為此本文總結了問題出現的原因和解決方法,通過這篇文章希望你能解決這個問題。
首先我們創建一個控制臺項目,下載基礎包
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();
}
}注入后臺服務非常簡單,調用service.AddHostedService方法將自定義的服務進行注入。
service.AddHostedService<CustomerJob/Service>();
自定義的后臺服務類需要滿足定義的接口,才可以被正常使用,下面我引用一個官方的案例進行說明
定時后臺任務使用 [System.Threading.Timer]類。 計時器觸發任務的
DoWork方法。 在StopAsync上禁用計時器,并在Dispose上處置服務容器時處置計時器:
繼承IHostedService接口,實現StartAsync和StopAsync方法即可將服務正常注入后臺任務中。
IDisposable的作用主要是在進程關閉時釋放定時器資源
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();
}
}將上文中的內容進行一個整合,得到的效果是
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即可查看執行效果
以上說明的是后臺任務在Core控制臺中的應用,那么在AspNetCore【Web項目】中是怎么使用的呢。當然都是一樣的,只是注入的地方發生了小小的改變,在AspNetCore中注入通常發生在StartUp.cs中的方法ConfigureServices。使用方法和控制臺一致。
public void ConfigureServices(IServiceCollection services)
{
service.AddHostedService<TimedHostedService>();
}適用于Web項目中涉及數據庫等外連接操作的場景,例如
每一次web請求對應一個數據庫上下文[DbContext],這個時候就要用要帶作用域的服務。
帶作用域的服務使用也非常簡單,可以參考官方文檔,這里我就不做其他介紹
看完上述內容,你們掌握NetCore中怎么利用托管服務執行后臺任務的方法了嗎?如果還想學到更多技能或想了解更多相關內容,歡迎關注億速云行業資訊頻道,感謝各位的閱讀!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。