我正在创建一名工人。
现在它使用自旋锁。
我认为必须有更好的方法来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\",...
方法。
答案 0 :(得分:1)
如果您实施的API基本上是同步的,则切换到async
不一定是可能的或可取的。您可以执行“同步异步”,但这是一种反模式,从根本上说,如果您这样做,您将不会实现预期的“释放线程” - 您只需要添加大量async
/ await
机器,无需获得好处。所以:只需保持同步,直到来自调用者的异步API 可用。注意:不执行async void
- 如果您这样做,来电者会认为您已在错误的时间内完成