Может ли асинхронный метод ожидать нескольких ответов? - PullRequest
2 голосов
/ 01 июня 2019

Я узнаю больше о массовом транспорте в свободное время. Пожалуйста, смотрите код ниже:

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 / использовании / request-response.html

GetResponse отправляет сообщение на фанатский обмен rabbitmq, у которого есть x потребителей. Каждый потребитель должен отправить ответ издателю, однако приведенный выше код получит только один ответ и затем продолжит работу. Как он может получить x ответов?

Мне удалось сделать это с RabbitMQ (без Mass Transit) следующим образом: 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}");
                    });
                });

Теперь я могу получить доступ к списку тестов внутри отправителя.

1 Ответ

1 голос
/ 01 июня 2019

Я полагаю, что вы сможете добиться такого же поведения, как в примере с разбросом / сборкой, используя Task.WhenAll (IEnumerable) . На странице запроса-ответа Mass Transit есть раздел о том, как его использовать в Составление нескольких результатов .

Следуя примеру кода из Mass Transit, предположим, что у вас есть несколько 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);
}
...