为微软Azure服务总线代理消息实现SendBatchAsync

本文关键字:消息 实现 SendBatchAsync 代理 总线 微软 Azure 服务 | 更新日期: 2023-09-27 17:53:16

我的要求是必须异步地将代理消息列表发送到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);并退出代码,即应用程序调试完成。它不会返回到while条件。然而,如果我使用SendBatch,而不是使用SendBatchAsync,它工作得很好。我做错了什么?

解决方案:问题与调用上述函数的测试方法有关。它是空的。它的类型应该是async Task。非常感谢Ned Stoyanov在这方面的帮助。

为微软Azure服务总线代理消息实现SendBatchAsync

当遇到await语句时,async方法返回并设置正在等待的异步操作。在await完成后,方法的其余部分继续。

你可能不能像那样遍历async方法,但试着在await之后放一个断点,当异步调用完成时,它应该会被击中。

或者,你可能会遇到死锁,请参阅这篇文章,了解一些避免死锁的方法。

正如我们在讨论中提到的,单元测试也需要是async,返回Taskawait任何async调用

[TestMethod] 
public async Task SendRegionsEnrollmentMessages() 
{ 
    EventManager eventMgr = new EventManager(clientUrn, programUrn, "CW"); 
    await eventMgr.SendBatchEvents(EventType.ENROLLMENT); 
}