取消令牌提供程序
CancellationToken支持线程、线程池工作项或Task对象之间的协作式取消。为处理操作可能被取消的情况,ABP提供了ICancellationTokenProvider来从源获取CancellationToken本身。
何时使用手动取消令牌
ABP会尽可能自动处理取消令牌的使用。例如在ASP.NET Core应用程序中,ABP会自动从HttpContext.RequestAborted获取CancellationToken,并在数据库查询及其他可取消操作中使用。因此在大多数情况下,您不需要手动处理CancellationToken对象在方法间传递。
除非您需要在自定义逻辑中添加取消支持,或需要向ABP框架外部的方法传递取消令牌,否则不需要使用
ICancellationTokenProvider。
ICancellationTokenProvider服务
ICancellationTokenProvider是为不同场景提供CancellationToken的抽象接口。
通常您应该将CancellationToken作为方法参数传递使用。通过ICancellationTokenProvider,您无需为每个方法传递取消令牌。该服务可通过依赖注入注入,并从其源提供令牌。
示例:
using System.Threading.Tasks;
using Volo.Abp.DependencyInjection;
using Volo.Abp.Threading;
namespace MyProject
{
public class MyService : ITransientDependency
{
private readonly ICancellationTokenProvider _cancellationTokenProvider;
public MyService(ICancellationTokenProvider cancellationTokenProvider)
{
_cancellationTokenProvider = cancellationTokenProvider;
}
public async Task DoItAsync()
{
while (_cancellationTokenProvider.Token.IsCancellationRequested == false)
{
// ...
}
}
}
}
内置提供程序
HttpContextCancellationTokenProvider:ASP.NET Core应用程序的默认提供程序。它直接提供来自HttpContext.RequestAborted的Web请求源取消令牌。NullCancellationTokenProvider:内置提供程序,始终提供CancellationToken.None。当没有其他可用提供程序时使用此默认实现。
实现自定义取消令牌提供程序
您可以通过创建实现ICancellationTokenProvider接口的类来轻松创建自定义提供程序,如下所示:
using System.Threading;
namespace AbpDemo
{
public class MyCancellationTokenProvider
: ICancellationTokenProvider,
ITransientDependency // 也可设置为单例或作用域模式
{
public CancellationToken Token { get; } // 待实现:返回取消令牌
}
}
抠丁客


