我的要求是我必须异步地将代理消息列表发送到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 帮助我解决这个问题。
答案 0 :(得分:1)
async
方法在遇到await
语句后返回,并设置正在等待的异步操作。然后,在await
完成后,该方法的其余部分将继续。
您可能无法单步执行此类async
方法,但请尝试在await
之后设置断点,并在异步调用完成时触发它。
或者您可能遇到死锁,请参阅此post以了解避免此问题的方法。
正如我们在讨论中所提到的,单元测试也需要async
,返回Task
和await
任意async
来电
[TestMethod]
public async Task SendRegionsEnrollmentMessages()
{
EventManager eventMgr = new EventManager(clientUrn, programUrn, "CW");
await eventMgr.SendBatchEvents(EventType.ENROLLMENT);
}