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

时间:2013-04-13 18:24:01

标签: azure async-await

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

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

任何可以向我解释原因的人?

2 个答案:

答案 0 :(得分:22)

Run方法必须阻止。来自the docs

  

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

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

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

public async Task RunAsync()
{
  while (true)
  {
    await Task.Delay(60000);
  }
}

或者,您可以使用AsyncContext from my AsyncEx library

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

无论您选择哪个选项,Run 都应为async。对于控制台应用(see my blog for why async Main is not allowed),它有点像Main

答案 1 :(得分:0)

我建议Task.Delay的较低值,如1000(ms)。我怀疑工作者角色无法快速响应健康检查。然后,该角色被视为无响应并重新启动。

确保Run方法永远不会返回类似

的内容
while (true)
{               
    Thread.Sleep(1000);
}

或者在您的情况下使用Task.Delay