如何取消MediatR发送的查询?

ca9*_*3d9 3 c# mediatr blazor

我在 .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 ...;
    }
}
Run Code Online (Sandbox Code Playgroud)

在 UI 部分,以下用于发送查询请求。

async Task SearchClicked() 
{
    sendResult = await mediator.Send(new GetSaleQuery{ Id = id });
    // page will use sendRest to display the result  .....
}
Run Code Online (Sandbox Code Playgroud)

现在我需要添加一个取消按钮来让用户取消长时间运行的查询。如何将取消令牌传递给查询处理程序GetSaleQueryHandler.Handle()

async Task CancelButtonClicked() 
{
    // ?????
}
Run Code Online (Sandbox Code Playgroud)

Mar*_*ies 7

这基本上就是取消标记的用途,如果您查看 mediatrSend方法,您会看到它有一个取消标记作为可选参数:

Task<object> Send(object request, CancellationToken cancellationToken = default (CancellationToken));
Run Code Online (Sandbox Code Playgroud)

您可以在此处阅读有关它们的更多信息:https : //docs.microsoft.com/en-us/dotnet/api/system.threading.cancellationtoken?view=netframework-4.8

CancellationToken 启用线程、线程池工作项或任务对象之间的协作取消。您可以通过实例化 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 ;
Run Code Online (Sandbox Code Playgroud)

然后,当您取消时,您需要使用该取消令牌来取消操作:

void Cancel(CancellationTokenSource token)
{
  token.Cancel();
}
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助。