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 关注
- 109 浏览
添加回答
举报