QqsClient.SendMessageAsync без ожидания не работает - PullRequest
0 голосов
/ 31 октября 2018

У меня есть лямбда-функция, и эта лямбда-функция должна отправлять сообщения в несколько очередей в SQS и затем выходить,

Если я добавлю await, то сообщения будут отправлены во все очереди,

var sqsClient = ServerlessHelper.GetAmazonSqsClient();
foreach (var item in items)
{
    await sqsClient.SendMessageAsync(item.QueueUrl, item.Message);
}

Но если я удаляю await из кода, то ни одно из сообщений не отправляется в очереди. Я хочу отправлять сообщения параллельно. Но из-за ожидания я не могу отправлять сообщения параллельно. Я пытаюсь сделать что-то вроде этого,

var sqsClient = ServerlessHelper.GetAmazonSqsClient();
foreach (var item in items)
{
    sqsClient.SendMessageAsync(item.QueueUrl, item.Message);
}
// wait until are messages are sent to queues.

Возможно ли это сделать?

Ответы [ 2 ]

0 голосов
/ 31 октября 2018

Я предполагаю, sqsClient.SendMessageAsync(item.QueueUrl, item.Message); возвращает задание, поскольку это асинхронная функция?

Вам нужно сохранить экземпляры задачи, а затем использовать Task.WhenAll, как в этом примере .

0 голосов
/ 31 октября 2018

Да, это возможно так:

await Promise.all(
    items.map(item => 
        sqsClient.SendMessageAsync(item.QueueUrl, item.Message)
    )
)

Функция карты создаст массив обещаний. Этот массив может быть заключен в одно обещание функцией Promise.all, которую вы можете ждать. Таким образом, обещания будут выполняться одновременно.

...