async / await for Worker

时间:2017-05-09 15:27:28

标签: c# multithreading azure asynchronous

我正在创建一名工人。

现在它使用自旋锁。

我认为必须有更好的方法来Run()

理想情况下,我想让我的工作人员等待队列,直到收到消息,然后处理它。

Main()方法与public override void Run() { while (true) { Message msg = queue.GetMessage(); if (msg != null) { ProcessMessage(msg); } else { Thread.Sleep(1000); } } } 完全相同...为了让工作人员保持活力,它无法退出。

我今天的代码:

queue.GetMessageAsync()

我尝试了什么:

Microsoft提供了Message msg = await queue.GetMessageAsync();方法。

我尝试了public override async Task RunAsync()

问题是当我这样做时,我被迫将Run方法的签名更改为:

Run()

这不起作用,因为工作人员有一个非常具体的API,我需要一个具有确切签名的"PostEventsModels":"[{\"Id\":\"23\",... 方法。

1 个答案:

答案 0 :(得分:1)

如果您实施的API基本上是同步的,则切换到async不一定是可能的或可取的。您可以执行“同步异步”,但这是一种反模式,从根本上说,如果您这样做,您将不会实现预期的“释放线程” - 您只需要添加大量async / await机器,无需获得好处。所以:只需保持同步,直到来自调用者的异步API 可用。注意:执行async void - 如果您这样做,来电者会认为您已在错误的时间内完成