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
中调用的任何方法。它将允许应用程序正常关闭,以防请求的关闭发生得太早,导致托管服务尚未完全启动。这可能不是由于取消的特定用途。一般规则是每个异步方法都应该有一个取消令牌参数。因此,如果将来需要令牌,它不是一个突破性的改变。