1 回答

TA貢獻1784條經驗 獲得超7個贊
因為它被調用了兩次——一次是在延遲之后,另一次是在服務實際停止時。RunAsync它并不意味著在使用時被調用。
要在超時后停止,請使用帶有超時的 CancellationTokenSource 并將其令牌傳遞給RunAsync:
var timeoutCts=new CancellationTokenSource(5000);
await host.RunAsync(timeoutCts.Token);
解釋
StopAsync 不會停止服務,它用于通知服務需要停止。當應用程序停止時,它由托管服務基礎設施本身調用。
.NET Core 是開源的,這意味著您可以檢查RunAsync 源。RunAsync啟動主機,然后等待終止:
await host.StartAsync(token);
await host.WaitForShutdownAsync(token);
WaitForShutdownAsync方法偵聽來自控制臺或通過顯式調用的終止請求IHostApplicationLifetime.StopApplication。當這種情況發生時,它會調用StopAsync自己:
await waitForStop.Task;
// Host will use its default ShutdownTimeout if none is specified.
await host.StopAsync();
如果您打算自己管理應用程序的生命周期,則應該使用StartAsync而不是。RunAsync
但在這種情況下,您只需在超時時停止應用程序。您可以通過CancellationTokenSource(int)構造函數將取消令牌傳遞給RunAsync僅在超時后觸發的取消令牌,從而輕松地做到這一點:
var timeoutCts=new CancellationTokenSource(5000);
await host.RunAsync(timeoutCts.Token);
- 1 回答
- 0 關注
- 150 瀏覽
添加回答
舉報