0

我的要求是我必须将代理消息列表异步发送到 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 它可以正常工作。我究竟做错了什么?

解决方案:问题出在调用上述函数的测试方法上。它是 void 类型。它应该是异步任务类型。非常感谢Ned Stoyanov在这方面帮助我。

4

1 回答 1

1

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

您可能无法逐步async执行这样的方法,但尝试在 之后放置一个断点await,它应该在异步调用完成时被命中。

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

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

[TestMethod] 
public async Task SendRegionsEnrollmentMessages() 
{ 
    EventManager eventMgr = new EventManager(clientUrn, programUrn, "CW"); 
    await eventMgr.SendBatchEvents(EventType.ENROLLMENT); 
}
于 2015-06-03T11:08:59.533 回答