Внедрение посреднических сообщений 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); 
}
Другие вопросы по тегам