C# 如何在MassTransit ESB中使用CancellationToken取消请求/响应通信?

C# 如何在MassTransit ESB中使用CancellationToken取消请求/响应通信?,c#,masstransit,cancellation,C#,Masstransit,Cancellation,我有一个简单的masstransit请求/响应概念证明。它由两个应用程序组成:一个用于发送消息,另一个用于消费消息。 消息发送应用程序如下所示: var basicClient=_busControl.CreateRequestClient<IRequest,IResponse>(queueUri, timeout); return await basicClient.Request(new Request(json), token); 正如我们所见,ConsumeContext也

我有一个简单的masstransit请求/响应概念证明。它由两个应用程序组成:一个用于发送消息,另一个用于消费消息。 消息发送应用程序如下所示:

var basicClient=_busControl.CreateRequestClient<IRequest,IResponse>(queueUri, timeout);
return await basicClient.Request(new Request(json), token);
正如我们所见,
ConsumeContext
也有一个
CancellationToken
字段

所以问题是:我如何使用这些代币

在我的消息发送应用程序中,我想取消等待响应, 在消息consumer中,我想取消等待
\u longrunningJob
完成

  • 当我尝试将令牌传递给
    请求
    方法,然后在我的
    取消令牌源
    上调用
    取消()
    时,我希望该方法抛出
    操作取消异常
    ,但我只得到了响应
  • 我还试图将一个已经取消的令牌传递给这个方法,但什么也没发生
  • 然后我查看了Masstransit的源代码,发现token.throwifcancellationRequested()没有在任何地方调用
    那么,请告诉我,我在这里做错了什么,有没有其他方法来处理CancellationToken,或者这只是Masstransit的错误?

    传递到请求中的
    CancellationToken
    是取消请求本身,而不是传递给消费者

    我们通过以下方法成功取消了消费者:

  • 将到期日期标头添加到请求(UtcNow+超时)
  • 在Consumer中,将ExpiryDate标头与UtcNow进行比较,如果较旧,则退出该方法

  • 您需要抛出“token.throwifcancellationisrequest()”,否则您的异步任务将永远不知道是否已取消。在请求程序中,您可以指定超时,我认为这比使用取消令牌要好。不确定消费者,它只是与长时间运行的任务进行常规异步/等待,与MassTransit无关。我不确定消费者的取消令牌是否对请求者有任何请求。我认为通知请求者消费者发生了什么事情的正确方法是发送正确的响应消息,而不是使用技术细节。@x。。。我不需要调用那个方法,但我认为MassTransit应该调用。@AlexeyZimarev:为什么使用超时比使用取消令牌更好?它们用于不同的原因,我想知道,当用户只需按下UI中的“取消”按钮时,如何使用超时。@DanielVygolov当用户单击“取消”时,我将正确处理它并在响应消息中返回它。这是业务的一部分,不需要涉及技术细节。
    public async Task Consume(ConsumeContext<IRequest> context)
    {
          var outputJson = await _longRunningJob.Execute(context.Message.Input, context.CancellationToken);
          context.Respond(new Response(outputJson));
    }