C# Azure WorkerRole API调用异步/等待

C# Azure WorkerRole API调用异步/等待,c#,azure,async-await,azure-worker-roles,C#,Azure,Async Await,Azure Worker Roles,我有一个Azure worker角色,它使用Client.OnMessage消息泵指令从服务总线队列读取消息 下面是一个示例代码: public override void Run() { Client.OnMessage((receivedMessage) => { var APIResponse = Call3rdPartyAPIUsingMessageData(receivedMessage) }, options); } 问题是第三

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

下面是一个示例代码:

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

         var APIResponse = Call3rdPartyAPIUsingMessageData(receivedMessage)

     }, options);

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

我想要的是利用async/await来保存线程。 也就是说,我希望工作者角色暂停此消息并处理队列中的下一条消息。当第三方API调用完成时,返回并完成操作

看看stackoverflow ex:上的其他答案,在worker角色中使用async/await似乎不是一个好主意


我的选项是什么?

工作者角色用于运行长时间处理任务。这是它们被制造出来的原因之一

如果您想采用另一种最聪明的方法,请尝试paralls:


通过这种方式,您可以同时处理数据,当然也可以获得更快的结果。

您不必尝试并行。此外,工作者角色只能像前面提到的那样使其入口点同步,所以您不能更改这一点

你从错误的角度看待这个问题。您正在使用的ServiceBus QueueClient有一个MaxConcurrentCalls选项,用于设置连接到SB时要使用的线程数。每次调用OnMessage时,都会使用一个新线程,直到达到MaxConcurrentCalls阈值。所以这已经扩展到了一个点

您需要做的是调用API异步的代码,例如,将其包装到任务中,而不是OnMessage,因为这样做没有意义


编辑:我忘了提到的,这可能是最好的方法,就是在有I/O绑定工作的情况下使用OnMessageSync,就像在您的情况下调用API一样。

看看TPL DataFlow.interest。在azure中,什么样的应用程序/服务/webjob/etc将利用TPL数据流。您希望对服务总线进行多少并发调用?为了异步调用API调用,您需要使用等待术语。要做到这一点,您需要使Main异步。不能使主方法异步。编辑:可以,但是主方法关闭,工作角色重新启动-终止异步请求任务。异步不一定意味着异步关键字。异步意味着在不阻塞线程的情况下进行处理。这也可以像Task.FromResult=>YourAppiCall.ContinueWithnextmethod那样完成;等等。只要你不想将结果返回到主线程,你就可以将其触发并忘记。我还忘了提到的是,你不必使用OnMessage,它是同步的。你可以使用OnMessageAsync,这是最合适的方式。太好了!错过了那个!太好了,我试试这个。