.net 我是否需要使用IHostedService显式创建取消令牌源?

ukqbszuj  于 2023-03-20  发布在  .NET
关注(0)|答案(2)|浏览(372)

库的内部实现是否为我提供了取消令牌源,还是我需要创建自己的令牌源?
我正在阅读documentation,看起来我需要在调用者方法中创建自己的源代码,然后将令牌传递给服务。

jchrr9hc

jchrr9hc1#

库的内部实现是否为我提供了取消令牌源,还是我需要创建自己的令牌源?
不,您不会得到CancellationTokenSource,只有CancelationTokenStartAsync/StopAsync方法(以支持正常关闭/中断,一些文档)。
如果需要取消调用某些服务,您还需要通过CancellationTokenSource.CreateLinkedTokenSource创建自己的CancellationTokenSource

class MyHostedService : IHostedService
{
    public Task StartAsync(CancellationToken cancellationToken)
    {
        var cts = CancellationTokenSource.CreateLinkedTokenSource(cancellationToken);
        cts.CancelAfter(1000); // for example

        await someService.DoAsync(cts.Token);
    }

    public Task StopAsync(CancellationToken cancellationToken)
    {
        var cts = CancellationTokenSource.CreateLinkedTokenSource(cancellationToken);
        cts.CancelAfter(1000); // for example

        await anotherService.DoAsync(cts.Token);
    }
}

如果您没有自定义取消逻辑,则使用传递的cancellationToken就足够了。

还可以考虑使用BackgroundService基类,它封装了一些常用的托管服务样板代码。

qyzbxkaa

qyzbxkaa2#

如果您使用AddHostedService<T>扩展方法添加服务,那么它将被提供一个停止令牌,如果/当主机被正常终止时,该令牌将被取消。
如果出于某种原因,您通过其他一些手动方法(例如测试)调用服务,那么您可能希望为它提供一个取消令牌。
https://learn.microsoft.com/en-us/dotnet/api/microsoft.extensions.dependencyinjection.servicecollectionhostedserviceextensions.addhostedservice

相关问题