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

C# asp.net core中IHostedService.StartAsync中的CancellationToken有什么意义?,c#,async-await,asp.net-core-hosted-services,C#,Async Await,Asp.net Core Hosted Services,我正在尝试实现托管服务,我想知道在IHostedService.StartAsync调用中使用CancellationToken应该做什么 关于StopAsync中的取消令牌本质上是一个超时(默认为5秒),这意味着正常关机应该在合理的时间范围内发生 但是关于StartAsync中的令牌,没有多少信息。如果有什么区别的话,文档规定实现不应该等待长时间运行的初始化过程,而应该返回一个长时间运行的任务。 因此,如果我支持取消,我是否应该将取消令牌传递给创建长时间运行任务的对象?如果是,取消此令牌不是更

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

关于
StopAsync
中的取消令牌本质上是一个超时(默认为5秒),这意味着正常关机应该在合理的时间范围内发生

但是关于
StartAsync
中的令牌,没有多少信息。如果有什么区别的话,文档规定实现不应该等待长时间运行的初始化过程,而应该返回一个长时间运行的任务。 因此,如果我支持取消,我是否应该将取消令牌传递给创建长时间运行任务的对象?如果是,取消此令牌不是更愚蠢的
StopAsync
?为什么框架会这样做

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

那么,我是否认为框架传递的初始令牌的全部要点实际上是用于阻塞 尽管如此,还是通过覆盖虚拟
BackgroundService.StartAsync
方法进行初始化过程(尽管doc建议反对)?e、 g

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);
    }
}

传递到
StartAsync
CancellationToken
可用于确定是否应取消启动过程,但据我所知,您已经知道了这一点。这是写的

指示启动进程已中止

如果查看,可以看到传递到
StartAsync
函数的
CancellationToken
链接到。据我所知,如果应用程序关闭得太早,以致于还没有完全启动所有托管服务,则仅使用此令牌。但是,我不知道如果启动令牌被触发,是否会调用
StopAsync
(我必须进一步挖掘源代码或在文档中搜索更多)

总而言之:

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

这可能不是由于取消的特定用途。一般规则是每个异步方法都应该有一个取消令牌参数。因此,如果将来需要令牌,它不是一个突破性的改变。