我有這個簡單的最小 API:
var builder = WebApplication.CreateBuilder(args);
// my long running process <----
builder.Services.AddHostedService<MyBackgroundService>();
var app = builder.Build();
app.MapGet("/", () => "Hello World!");
app.Run();
這是MyBackgroundService:
public class MyBackgroundService : BackgroundService
{
protected override async Task ExecuteAsync(CancellationToken stoppingToken)
{
while(stoppingToken.IsCancellationRequested == false)
{
await Task.Delay(1000); // wait 1 second
Console.WriteLine("doing work..."); // do work
}
}
}
這是使用 aTask而不是使用后臺服務撰寫的相同程式:
var builder = WebApplication.CreateBuilder(args);
// my long running process in a task instead of a background service
_ = Task.Run(async () =>
{
while (true) {
await Task.Delay(1000); // wait 1 second
Console.WriteLine("doing work..."); // do work
}
});
var app = builder.Build();
app.MapGet("/", () => "Hello World!");
app.Run();
為什么互聯網上的教程和地方鼓勵您使用BackgroundService?如果我在使用 Task.Run 的地方使用第二種方法,那會是錯誤的做法嗎?使用第一種方法與使用第二種方法有什么區別?
uj5u.com熱心網友回復:
由你決定。
基本上,這是一個使用現有框架還是自己做的問題。
如果這是一個最多可容納 3 人的小型專案,并且您不打算部署到 Azure,我不會害怕使用您自己的解決方案 - Task. 否則,我會伸手去拿BackgroundService。
在這里很好地描述了:https ://docs.microsoft.com/en-us/aspnet/core/fundamentals/host/hosted-services?view=aspnetcore-6.0&tabs=visual-studio
BackgroundService允許集成到具有豐富監控功能的更大生態系統中Task始終可用,簡單明了 - 但您可以自己解決所有問題
提示:查找您的代碼
_ = Task.Run(async () => ...
你確定那個丟棄_沒問題嗎?
uj5u.com熱心網友回復:
在查看類的Host源代碼后,我很確定 aBackgroundService是一個正常的任務,除了以下功能:
當應用程式啟動或停止時,它會收到通知。
它處理例外,例如
OperationCanceledException.
uj5u.com熱心網友回復:
這是一個關于軟體架構的問題(即使你沒有意識到)。
當然,您可以將所有內容放在一個大檔案中,哎呀,您甚至不需要那些稱為“子例程”的東西。我的意思是在 60 年代,如果沒有它們,它們可以完美地作業......但當然當時的程式很小。
為了保持軟體的可維護性、可測驗性、可靠性等,許多軟體開發技術已組合成某些“架構”、“原則”、“指南”等,即構建程式的方式。
讓我們從“子程式”開始。那些并不總是在那里。有一次,有人發現重復代碼可以放在一個單獨的地方并一遍又一遍地呼叫。它調整了分離代碼使其更好的可讀性、可維護性、可測驗性等。
其中另一個是控制反轉,比如依賴注入。這個用于后臺服務,可以在構建bg服務物件的程序中決議和注入其他服務。
另一種是單例,即只有一個工人實體。當然,您可以自己制作,但該框架為您提供了一種標準化的方式來構建這樣的單例后臺作業程式。所以它是一種“建造者”,也是一種設計模式。這有助于您了解另一個原則:不要重復自己。不要重復自己。
您是否正在慢慢開始看到大局?
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/496130.html
上一篇:TimeoutException:使用CompositeServerSelector選擇服務器30000毫秒后發生超時
