Azure WorkerRole API调用async / await

时间:2015-03-26 16:30:51

标签: c# azure async-await azure-worker-roles

我有一个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并不是一个好主意。

我有什么选择?

2 个答案:

答案 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一样。