1 回答

TA貢獻(xiàn)1784條經(jīng)驗(yàn) 獲得超7個(gè)贊
因?yàn)樗徽{(diào)用了兩次——一次是在延遲之后,另一次是在服務(wù)實(shí)際停止時(shí)。RunAsync它并不意味著在使用時(shí)被調(diào)用。
要在超時(shí)后停止,請(qǐng)使用帶有超時(shí)的 CancellationTokenSource 并將其令牌傳遞給RunAsync:
var timeoutCts=new CancellationTokenSource(5000);
await host.RunAsync(timeoutCts.Token);
解釋
StopAsync 不會(huì)停止服務(wù),它用于通知服務(wù)需要停止。當(dāng)應(yīng)用程序停止時(shí),它由托管服務(wù)基礎(chǔ)設(shè)施本身調(diào)用。
.NET Core 是開(kāi)源的,這意味著您可以檢查RunAsync 源。RunAsync啟動(dòng)主機(jī),然后等待終止:
await host.StartAsync(token);
await host.WaitForShutdownAsync(token);
WaitForShutdownAsync方法偵聽(tīng)來(lái)自控制臺(tái)或通過(guò)顯式調(diào)用的終止請(qǐng)求IHostApplicationLifetime.StopApplication。當(dāng)這種情況發(fā)生時(shí),它會(huì)調(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
但在這種情況下,您只需在超時(shí)時(shí)停止應(yīng)用程序。您可以通過(guò)CancellationTokenSource(int)構(gòu)造函數(shù)將取消令牌傳遞給RunAsync僅在超時(shí)后觸發(fā)的取消令牌,從而輕松地做到這一點(diǎn):
var timeoutCts=new CancellationTokenSource(5000);
await host.RunAsync(timeoutCts.Token);
- 1 回答
- 0 關(guān)注
- 166 瀏覽
添加回答
舉報(bào)