我在.Net core 3.1 Blazor应用程序中使用MediatR。以下是查询及其处理程序。
public class GetSaleQuery : IRequest<SaleVm>
{
public GetSaleQuery(string id)
{
Id = id;
}
public string Id { get; }
}
public class GetSaleQueryHandler : IRequestHandler<GetaQuery, SaleVm>
{
public async Task<SaleVm> Handle(GetSaleQuery request, CancellationToken cancellationToken)
{
var q = await _context.Table1
.ToListAsync(cancellationToken).ConfigureAwait(false);
return ...;
}
}
在UI部分中,以下内容用于发送查询请求。
async Task SearchClicked()
{
sendResult = await mediator.Send(new GetSaleQuery{ Id = id });
// page will use sendRest to display the result .....
}
现在,我需要添加一个“取消”按钮,以允许用户取消长时间运行的查询。如何将取消令牌传递给查询处理程序GetSaleQueryHandler.Handle()
?
async Task CancelButtonClicked()
{
// ?????
}
答案 0 :(得分:2)
从本质上讲,这是取消标记的用途,如果您查看mediatr Send
方法,您会发现它具有取消标记作为可选参数:
Task<object> Send(object request, CancellationToken cancellationToken = default (CancellationToken));
您可以在此处了解有关它们的更多信息:https://docs.microsoft.com/en-us/dotnet/api/system.threading.cancellationtoken?view=netframework-4.8
使用CancellationToken可以在线程,线程池工作项或Task对象之间进行协作取消。您可以通过实例化CancellationTokenSource对象来创建取消令牌,该对象管理从其CancellationTokenSource.Token属性检索的取消令牌。然后,您将取消令牌传递给应该接收取消通知的任意数量的线程,任务或操作。令牌不能用于发起取消。当拥有对象调用CancellationTokenSource.Cancel时,取消令牌的每个副本上的IsCancellationRequested属性都设置为true。接收通知的对象可以适当的方式进行响应。
要执行查询时要执行的操作,您要返回取消令牌:
CancellationTokenSource source = new CancellationTokenSource();
CancellationToken token = source.Token;
var result = await _mediator.Send(new Operation(), token);
return source ;
然后,当您取消时,您将需要使用该取消令牌来取消操作:
void Cancel(CancellationTokenSource token)
{
token.Cancel();
}
希望这会有所帮助。