我有一个Azure辅助角色,使用Client.OnMessage()
消息泵指令从服务总线队列中读取消息。
以下是示例代码:
public override void Run()
{
Client.OnMessage((receivedMessage) => {
var APIResponse = Call3rdPartyAPIUsingMessageData(receivedMessage)
}, options);
}
问题是第三方API调用需要很长时间。坐在那里等待API调用同步完成似乎很愚蠢。
我想要的是利用async/await
来保存线程。
意思是,我希望工作者角色能够暂停此消息"并处理队列中的下一条消息。第三方API调用完成后,再跳回并完成操作。
查看stackoverflow上的其他答案(例如:here),似乎在worker角色中使用async/await
并不是一个好主意。
我有什么选择?
答案 0 :(得分:0)
工作者角色用于运行长时间处理任务。这是他们制造的一个原因。
如果你想做一个不同的(最聪明的)approuch,试试paralls: http://blogs.msdn.com/b/csharpfaq/archive/2010/06/01/parallel-programming-in-net-framework-4-getting-started.aspx
这样,您可以同时处理数据,并且肯定会有更快的结果。
答案 1 :(得分:0)
您不必尝试使用parallels。此外,工作者角色只能像已经提到的那样使其入口点同步,因此您无法更改它。
你从错误的角度看问题。您正在使用的ServiceBus QueueClient具有MaxConcurrentCalls选项,该选项设置连接到SB时将使用的线程数。每次调用OnMessage时,都会使用新线程,直到达到MaxConcurrentCalls阈值。所以这已经扩展到了一个点
你想要做的是调用API异步的代码(例如通过将其包装到Task中),而不是你的OnMessage,因为没有必要这样做。
编辑:我忘了提及它可能是最好的方法,就是在你有I / O绑定工作时使用OnMessageAsync,就像在你的情况下调用API一样。