Подтвердить что ты не робот

Async/ожидание в роли лазурного рабочего, вызывающее повторное использование роли

Я играю с Tasks, Async и жду в своем WorkerRole (RoleEntryPoint).

У меня были некоторые необъяснимые повторы, и теперь я узнал, что если что-то работает до долгого ожидания, роль перерабатывается. Чтобы воспроизвести его, просто запустите Task.Delay(60000) в методе Run.

Кто может объяснить мне почему?

4b9b3361

Ответ 1

Метод Run должен блокироваться. Из документы:

Если вы переопределите метод Run, ваш код должен блокироваться бесконечно. Если метод Run возвращается, роль автоматически перерабатывается, поднимая событие Stopping и вызывая метод OnStop, чтобы ваши последовательности выключения могли быть выполнены до того, как роль была отключена.

Простое решение состоит в том, чтобы просто сделать это:

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

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

В качестве альтернативы вы можете использовать AsyncContext из моей библиотеки AsyncEx:

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

Какой бы вариант вы ни выбрали, Run не должен быть async. Это похоже на Main для консольного приложения (см. Мой блог, почему async Main не разрешено).

Ответ 2

Я бы рекомендовал меньшее значение для Task.Delay, например 1000 (мс). Я подозреваю, что рабочая роль не может достаточно быстро реагировать на проверку работоспособности. Затем роль считается невосприимчивой и возобновляется.

Убедитесь, что метод Run никогда не возвращается с чем-то вроде этого

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

Или с Task.Delay в вашем случае.