我目前正在实现一些基于Asp.Net Core Identity的UserManger设计的服务。在实现中,我想知道如果不可能将cancellation Token传递到usermanager的方法中,那么usermanager如何支持取消。
我还看到usermanager内部有一个Cancellation Token属性(具有默认值(,它在内部使用,并将传递给使用的异步方法。但由于其保护级别为,因此无法访问此属性
protected virtual CancellationToken CancellationToken => CancellationToken.None;
例如,我如何将我在控制器中使用的Cancellation令牌传递到用户管理器?我必须重载它并通过一个新方法将它传递到它中吗?
public class MyUserManager : UserManager<MyUser>
{
/* ... Other stuff... */
protected override CancellationToken CancellationToken {get;set;}
public void SetCancellationToken(CancellationToken cancellationToken)
{
this.CancellationToken = cancellationToken;
}
}
这是用userManager完成取消的正确方法吗?如果是:为什么这与使用CancellationToken的其他组件不同,比如EF Core,你必须通过方法参数传递CancellationToken?
UserManager
内部处理取消,并从HttpContext.RequestAborted
获取取消令牌。因此,您不需要传入取消令牌,这就是为什么方法不接受取消令牌的原因。
在UserManager
中,设置CancellationToken = CancellationToken.None
,并将其用于所有任务。
https://github.com/dotnet/aspnetcore/blob/b9efadc59ddbf6743775244622fb95301dd1846c/src/Identity/Extensions.Core/src/UserManager.cs#L53
如微软文档中所述:
此属性返回的取消令牌无法取消
所以UserManager
的所有任务都将在调用Dispose()
方法之后执行,因为所有任务都调用了ThrowIfDisposed
。