我会在业余时间学习有关公交的更多信息。请参见下面的代码:
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/。但是,我不知道如何使用大众运输。
异步方法可以等待多个答复吗?
答案 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);
}