为 Microsoft Azure 服务总线中转消息实施 SendBatchAsync
Implementing SendBatchAsync for Microsoft Azure Service Bus Brokered Messages
我的要求是必须将代理消息列表异步发送到 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);
并退出代码,即应用程序调试已完成。它不会 return 回到 while 条件。但是,如果我使用 SendBatch,而不是使用 SendBatchAsync,它工作正常。我做错了什么?
解决方案:问题出在调用上述函数的测试方法上。它是 void 类型的。它应该是异步任务类型。非常感谢 Ned Stoyanov 在这方面帮助我。
async
方法 returns 在遇到 await
语句后设置正在等待的异步操作。 await
完成后,该方法的其余部分将继续。
您可能无法像那样单步执行 async
方法,但尝试在 await
之后放置一个断点,它应该会在异步调用完成时命中。
或者您可能遇到死锁,请参阅此 post 以了解一些避免死锁的方法。
正如我们在讨论中提到的,单元测试也需要 async
,return 一个 Task
和 await
任何 async
调用
[TestMethod]
public async Task SendRegionsEnrollmentMessages()
{
EventManager eventMgr = new EventManager(clientUrn, programUrn, "CW");
await eventMgr.SendBatchEvents(EventType.ENROLLMENT);
}
我的要求是必须将代理消息列表异步发送到 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);
并退出代码,即应用程序调试已完成。它不会 return 回到 while 条件。但是,如果我使用 SendBatch,而不是使用 SendBatchAsync,它工作正常。我做错了什么?
解决方案:问题出在调用上述函数的测试方法上。它是 void 类型的。它应该是异步任务类型。非常感谢 Ned Stoyanov 在这方面帮助我。
async
方法 returns 在遇到 await
语句后设置正在等待的异步操作。 await
完成后,该方法的其余部分将继续。
您可能无法像那样单步执行 async
方法,但尝试在 await
之后放置一个断点,它应该会在异步调用完成时命中。
或者您可能遇到死锁,请参阅此 post 以了解一些避免死锁的方法。
正如我们在讨论中提到的,单元测试也需要 async
,return 一个 Task
和 await
任何 async
调用
[TestMethod]
public async Task SendRegionsEnrollmentMessages()
{
EventManager eventMgr = new EventManager(clientUrn, programUrn, "CW");
await eventMgr.SendBatchEvents(EventType.ENROLLMENT);
}