异步方法可以等待多个响应吗?



我在空闲时间学习更多关于公共交通的知识。 请参阅下面的代码:

var serviceAddress = new Uri("rabbitmq://localhost/check-order-status");
var client = bus.CreateRequestClient<CheckOrderStatus>(serviceAddress);
var response = await client.GetResponse<OrderStatusResult>(new { OrderId = id});

我从这里拿来的:http://masstransit-project.com/MassTransit/usage/request-response.html

GetResponse 向具有 x 个使用者的 rabbitmq 扇出交易所发送一条消息。 每个消费者都需要向发布者发送回复,但是上面的代码只会收到一个回复,然后继续。 它如何收到 x 回复?

我已经设法用RabbitMQ(没有公共交通(做到这一点,就像这样:https://dotnetcodr.com/2014/05/12/messaging-with-rabbitmq-and-net-c-part-5-headers-and-scattergather/。 但是,我无法弄清楚如何通过公共交通做到这一点。

异步方法可以等待多个回复吗?

更新

使用处理程序似乎有效:

 sbc.ReceiveEndpoint(host, myMessage.Id.ToString(), ep =>
                {
                    ep.Handler<MyMessage>(context =>
                    {
                        testlist.Add(context.Message);
                        return Console.Out.WriteLineAsync($"Received: {context.Message.Name}");
                    });
                });

我现在可以访问发件人内部的测试列表。

我相信

你应该能够通过使用Task.WhenAll(IEnumerable(实现与scatter/gather示例类似的行为。公共交通请求-响应页面中有一节介绍如何在撰写多个结果时使用它。

按照公共交通中的示例代码,假设您在一个字段中存储了多个服务地址:

ICollection<Uri> _serviceAddresses;

如果要从所有客户端获取 CheckOrderStatus 响应,可以按如下方式执行此操作:

var getResponseTasks = new List<Task<Response<CheckOrderStatus>>>();
foreach(var serviceAdress in _serviceAddresses)
{
    var client = bus.CreateRequestClient<CheckOrderStatus>(serviceAddress);
    getResponseTasks.Add(client.GetResponse<OrderStatusResult>(new { OrderId = id}));
}
await Task.WhenAll(getResponseTasks);

现在,您只需要解开结果:

var responses = new List<Response<CheckOrderStatus>>();
foreach(var responseTask in getResponseTasks)
{
    var response = await responseTask;
    responses.Add(response);
}

最新更新