首页 文章

Azure WorkerRole API调用async / await

提问于
浏览
0

我有一个Azure辅助角色,它使用 Client.OnMessage() 消息泵指令从服务总线队列中读取消息 .

这是一个示例代码:

public override void Run()
{
     Client.OnMessage((receivedMessage) =>   {

         var APIResponse = Call3rdPartyAPIUsingMessageData(receivedMessage)

     }, options);

}

问题是第三方API调用需要很长时间 . 坐在那里等待API调用同步完成似乎很愚蠢 .

我想要的是利用 async/await 来保存线程 . Meaning, I want the worker role to "pause this message" and process the next message in the queue. When the 3rd Party API call completes, then jump back in and complete the operation.

查看stackoverflow上的其他答案(例如:here),似乎在worker角色中使用 async/await 并不是一个好主意 .

我有什么选择?

2 回答

  • 0

    工作者角色用于运行长时间的处理任务 . 这是他们制造的一个原因 .

    如果你想做一个不同的(和最聪明的)approuch,试试paralls:http://blogs.msdn.com/b/csharpfaq/archive/2010/06/01/parallel-programming-in-net-framework-4-getting-started.aspx

    这样,您可以同时处理数据,并且肯定会有更快的结果 .

  • 0

    你不必尝试parallels . 此外,工作者角色只能像已经提到的那样使其入口点同步,因此您无法更改它 .

    你是从错误的角度看问题的 . 您正在使用的ServiceBus QueueClient具有MaxConcurrentCalls选项,该选项设置连接到SB时将使用的线程数 . 每次调用OnMessage时,都会使用新线程,直到达到MaxConcurrentCalls阈值 . 所以这已经达到了一定程度

    您想要做的是调用API异步的代码(例如,通过将其包装到Task中),而不是OnMessage,因为没有必要这样做 .

    编辑:我忘了提及它可能是最好的方法,就是使用OnMessageAsync,以防你有I / O绑定工作,就像在你的情况下调用API一样 .

相关问题