asp .net core 中 IHostedService.StartAsync 中的 CancellationToken 有什么意义?

Evr*_*glu 4 c# async-await asp.net-core-hosted-services

我正在尝试实现托管服务,我想知道我应该在通话中使用 CancellationToken 做什么IHostedService.StartAsync

Microsoft 文档中有很多关于取消令牌本质上StopAsync是超时(默认情况下 5 秒)的内容,这意味着应该在合理的时间范围内正常关闭。

但关于 中的 token StartAsync,信息并不多。如果有的话,文档指定实现不应等待长时间运行的初始化进程,而应仅返回长时间运行的任务。因此,如果我支持取消,我是否应该将取消令牌传递给创建该长时间运行任务的任何内容?如果是的话,取消这个令牌不是一个愚蠢的版本吗StopAsync?为什么框架会这样做?

事实上,在微软自己的抽象BackgroundService中,实现StartAsync实际上完全忽略了该令牌并创建了一个新的令牌,该令牌在调用时被取消StopAsync......

那么我是否认为框架传递的初始令牌的全部意义实际上是通过覆盖虚拟方法来用于阻止 初始化过程(尽管文档建议反对它)BackgroundService.StartAsync?例如

public class MyBackgroundService : BackgroundService
{
    public override Task StartAsync(CancellationToken cancellationToken)
    {
        // Block the thread for initialisation with cancellation (replace Task.Delay by actual initialisation)
        Task.Delay(TimeSpan.FromSeconds(10), cancellationToken).GetAwaiter().GetResult();

        // Start the long running task proper
        return base.StartAsync(cancellationToken);
    }

    protected override Task ExecuteAsync(CancellationToken stoppingToken)
    {
        // some long running process (write some actual background running code here)
        return Task.Factory.StartNew(_ => {while(!stoppingToken.IsCancellationRequested){}}, null, stoppingToken);
    }
}
Run Code Online (Sandbox Code Playgroud)

Joe*_*ius 11

传入CancellationTokenStartAsync可用于确定是否应取消启动过程,但据我了解,您已经知道了。这是写在这里的

表明启动进程已中止。

如果您查看调用的位置StartAsync,您可以看到CancellationToken传递到StartAsync函数中的which 与 链接IHostApplicationLifetime.ApplicationStopping。据我了解,如果应用程序关闭得太早以至于尚未完全启动所有托管服务,则仅使用此令牌。但是,我不知道如果StopAsync触发起始令牌是否会被调用(我必须进一步挖掘源代码或在文档中搜索更多内容)。

总结一下:
-methodCancellationToken中的StartAsync应该只传递给StartAsync支持取消的任何调用的方法。它将允许应用程序正常关闭,以防请求的关闭发生得太早以致托管服务尚未完全启动。