如何取消 MediatR 发送的查询?

Posted

技术标签:

【中文标题】如何取消 MediatR 发送的查询?【英文标题】:How to cancel the query sent by MediatR? 【发布时间】:2020-04-27 14:01:05 【问题描述】:

我在 .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() 

    // ?????

【问题讨论】:

假设您的 UI 部分正在使用 MVC,这里有一篇关于在 net core mvc andrewlock.net/… 中将取消令牌绑定到 HttpRequest 的好博文,如果需要很长时间,您可以中止您的请求。前端可能正在使用一些可能具有调用XMLHttpRequest.abort() 方法的按钮的ajax 请求。 在我的 Blazor 应用程序中,我将有一个取消按钮来取消请求。 【参考方案1】:

这基本上就是取消令牌的用途,如果您查看 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 可以在线程、线程池工作项或任务对象之间实现协作取消。您可以通过实例化 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();

希望这会有所帮助。

【讨论】:

以上是关于如何取消 MediatR 发送的查询?的主要内容,如果未能解决你的问题,请参考以下文章

MediatR 发布和 MediatR 发送

MediatR - 处理查询中的当前用户

具有通用处理程序和查询的 Mediatr

该程序无法找到 MediatR 查询 ASP.Net Core 的处理程序

MediatR CQRS模式解决将消息发送与消息处理进行了解耦,他同时支持异步和同步来发送和监听消息.

MediatR CQRS模式解决将消息发送与消息处理进行了解耦,他同时支持异步和同步来发送和监听消息.