项目

取消令牌提供程序

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; } // 待实现:返回取消令牌
    }
}
在本文档中