Внедрение посреднических сообщений SendBatchAsync для служебной шины Microsoft Azure
Мое требование заключается в том, что я должен асинхронно отправлять список посреднических сообщений на служебную шину Azure. Однако я не могу правильно реализовать метод SendBatchAsync. Позвольте мне объяснить подробно. Вот мой код:
public async Task SendBatchEnrollmentMessages()
{
while(somevalue)
{
//logic to fetch data from the SQL db through stored proc into list of brokered message i.e. messageList
if(messageList.Count() > 0)
{
await sender.SendMessagesAsync(messageList);
}
//some more logic for somevalue
}
}
где логика SendMessageAsync:
public async Task SendMessagesAsync(List<BrokeredMessage> brokeredMessageList)
{
var topicClient = CreateTopicClient();
await topicClient.SendBatchAsync(brokeredMessageList);
}
Моя проблема в том, что когда я отлаживаю приложение, используя точку останова, компилятор await topicClient.SendBatchAsync(brokeredMessageList);
и выходит из кода, т. е. отладка приложения завершена. Он не возвращается к условию времени. Однако вместо использования SendBatchAsync, если я использую SendBatch, он работает нормально. Что я делаю неправильно?
Решение: Проблема была в методе теста, который вызывал вышеуказанную функцию. Это было типа пустоты. Это должно было быть типа async Task. Большое спасибо Неду Стоянову за помощь в этом.
1 ответ
async
метод возвращает, когда после встречает await
оператор и устанавливает ожидаемую асинхронную операцию. Остальная часть метода затем продолжается после await
закончен.
Вы, вероятно, не можете пройти async
такие методы, но попробуйте поставить точку останова после await
и он должен получить удар, когда завершится асинхронный вызов.
В качестве альтернативы вы можете зайти в тупик, посмотрите этот пост, чтобы узнать, как этого избежать.
Как уже упоминалось в нашем обсуждении, модульный тест должен быть async
а также вернуть Task
а также await
любой async
звонки
[TestMethod]
public async Task SendRegionsEnrollmentMessages()
{
EventManager eventMgr = new EventManager(clientUrn, programUrn, "CW");
await eventMgr.SendBatchEvents(EventType.ENROLLMENT);
}