在Azure Cloud Service中使用await运行覆盖

时间:2013-09-10 09:01:39

标签: .net azure async-await

在Azure云服务运行覆盖中使用await是否存在任何问题?

我在一个函数调用中添加了一个await调用并开始得到非常奇怪的行为,后续的方法调用显然立即返回(尽管它们应该花费几秒钟)并且VS.NET 2012锁定并要求完全重启。

目前唯一的想法是,在await调用之后,Run方法正在另一个线程上执行,并且Azure中可能要求此Run覆盖始终在固定的线程上运行?

但是,如果是这种情况,是否有办法确保await调用始终同步回此线程?

或者其他什么东西可以发挥作用?

1 个答案:

答案 0 :(得分:3)

documentation for Run所述,您的方法不应该返回;如果是这样,Azure运行时会将其解释为错误并重新启动您的角色。

await导致其方法在等待操作时返回。如果不清楚,那么我有async intro on my blog您可能会觉得有帮助。

因此,Run方法不能是async

我通常在async方法中安装Run兼容的“主循环”,然后在其中运行无限循环。我的AsyncEx library有一个名为AsyncContext的“主循环”类型,可以像这样使用:

public override void Run()
{
  try
  {
    AsyncContext.Run(async () =>
    {
      // Can use await safely in here.
      while (true)
        ;
    });
  }
  catch (Exception ex)
  {
    // log
    throw;
  }
}

这种方法的缺点是它只能在角色实例中有效地使用单个线程。我只是设计我的扩展,只使用单核尺寸;它比使用多核大小和添加代码以支持多个async线程更容易。