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

时间:2019-06-01 09:26:07

标签: c# async-await rabbitmq masstransit

我会在业余时间学习有关公交的更多信息。请参见下面的代码:

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/。但是,我不知道如何使用大众运输。

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

1 个答案:

答案 0 :(得分:1)

我相信您可以通过使用Task.WhenAll(IEnumerable)来实现与分散/收集示例相似的行为。公交请求-响应页面上有一节介绍如何在Composing multiple results上使用它。

按照大众运输的示例代码,假设您在一个字段中存储了多个serviceAddresses:

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);
}