1 回答

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