异步/等待天蓝色工作者角色导致角色回收

Pou*_*sen 13 azure async-await

我正在使用Tasks,Async并在我的WorkerRole(RoleEntryPoint)中等待.

我有一些无法解释的回收,我现在发现,如果有一些东西在等待呼叫中运行很长时间,那么这个角色就会回收.要重现它,只需在Run方法中等待Task.Delay(60000).

有谁可以向我解释原因?

Ste*_*ary 22

Run方法必须阻止.来自文档:

如果覆盖Run方法,则代码应无限期阻塞.如果Run方法返回,则通过引发Stopping事件并调用OnStop方法自动回收角色,以便在角色脱机之前执行关闭序列.

一个简单的解决方案就是这样做:

public override void Run()
{
  RunAsync().Wait();
}

public async Task RunAsync()
{
  while (true)
  {
    await Task.Delay(60000);
  }
}
Run Code Online (Sandbox Code Playgroud)

或者,您可以AsyncContext从我的AsyncEx库中使用:

public override void Run()
{
  AsyncContext.Run(async () =>
  {
    while (true)
    {
      await Task.Delay(60000);
    }
  });
}
Run Code Online (Sandbox Code Playgroud)

无论您选择的选项,Run应该不会async.这有点像Main一个控制台应用程序(请参阅我的博客,了解为什么async Main不允许).