13

私はタスク、非同期で遊んでいて、WorkerRole (RoleEntryPoint) で待機しています。

説明のつかないリサイクルがいくつかありましたが、await 呼び出しで何かが長時間実行されている場合、ロールがリサイクルされることがわかりました。再現するには、Run メソッドで await Task.Delay(60000) を実行するだけです。

理由を説明できる人はいますか?

4

2 に答える 2

22

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ませasyncMainコンソール アプリのようなものです (許可されない理由については、ブログを参照してくださいasync Main)。

于 2013-04-13T18:59:49.233 に答える
0

Task.Delay1000 (ms) などの低い値をお勧めします。worker ロールが正常性チェックに十分な速さで応答できないのではないかと思います。その後、ロールは応答しないと見なされ、再起動されます。

Runメソッドがこのようなもので決して返らないことを確認してください

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

またはTask.Delayあなたの場合と一緒に。

于 2013-04-13T18:53:30.803 に答える