为Microsoft Azure Service Bus Brokered Messages实施SendBatchAsync

时间:2015-06-03 10:11:12

标签: c# azure async-await azureservicebus brokeredmessage

我的要求是我必须异步地将代理消息列表发送到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 帮助我解决这个问题。

1 个答案:

答案 0 :(得分:1)

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

您可能无法单步执行此类async方法,但请尝试在await之后设置断点,并在异步调用完成时触发它。

或者您可能遇到死锁,请参阅此post以了解避免此问题的方法。

正如我们在讨论中所提到的,单元测试也需要async,返回Taskawait任意async来电

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