【问题标题】:Async/await in azure worker role causing the role to recycleazure worker 角色中的异步/等待导致角色回收
【发布时间】:2013-04-13 18:24:00
【问题描述】:

我在我的 WorkerRole (RoleEntryPoint) 中使用 Tasks、Async 和 await。

我有一些无法解释的循环,现在我发现如果在 await 调用中运行时间过长,角色就会循环。要重现它,只需在 Run 方法中执行 await Task.Delay(60000)。

谁能给我解释一下为什么?

【问题讨论】:

    标签: azure async-await


    【解决方案1】:

    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。这有点像控制台应用程序的Main (see my blog for why async Main is not allowed)。

    【讨论】:

    • 如果运行是异步的,它不会无限期地阻塞吗?如您的答案所示,您的解决方案将在 60 秒后回收,对吗?
    • 我更新了我的帖子以包含指向我的博客的链接,说明为什么不允许使用 async Main。出于同样的原因,不允许使用 async Run。我的示例将在 60 秒后回收,因为它从 Run 返回。如果您不想回收,请不要从Run返回。
    • 在一般情况下可能不是一个好主意,但如果你希望你的 Run 无限期地阻塞,不管 RunAsync() 发生什么(或它最初执行的任何其他代码),你总是可以@987654324 @ 和 Timeout.Infinite :)
    • @Stehpen 只是想知道是否有更新版本?我意识到 Azure Worker Roles 并没有太大变化,但建议可能会。
    • @matt_lethargic:我不知道;自从 Azure Functions 出现以来,我就没有使用过 Azure Worker Roles。
    【解决方案2】:

    我建议Task.Delay 使用较低的值,例如 1000 (ms)。我怀疑工人角色无法对健康检查做出足够快的反应。然后该角色被视为无响应并重新启动。

    确保Run 方法永远不会返回类似这样的内容

    while (true)
    {               
        Thread.Sleep(1000);
    }
    

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

    【讨论】:

    • 有关于此健康检查的任何信息吗?它可以挂多久。我将它降低到 1000 毫秒,但只是想知道当我有一个长时间挂起的异步方法时导致问题的原因。这是因为我有一个异步方法可以在服务器上设置一些东西,这需要几分钟。等待它会导致它回收,并且没有等待它在 run 方法进入 while(true) 循环时运行良好。
    • 很遗憾,我没有来自任何官方来源的信息。有人回答了吗?
    猜你喜欢
    • 1970-01-01
    • 2018-03-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-29
    • 1970-01-01
    • 1970-01-01
    • 2013-04-08
    相关资源
    最近更新 更多