私はタスク、非同期で遊んでいて、WorkerRole (RoleEntryPoint) で待機しています。
説明のつかないリサイクルがいくつかありましたが、await 呼び出しで何かが長時間実行されている場合、ロールがリサイクルされることがわかりました。再現するには、Run メソッドで await Task.Delay(60000) を実行するだけです。
理由を説明できる人はいますか?
私はタスク、非同期で遊んでいて、WorkerRole (RoleEntryPoint) で待機しています。
説明のつかないリサイクルがいくつかありましたが、await 呼び出しで何かが長時間実行されている場合、ロールがリサイクルされることがわかりました。再現するには、Run メソッドで await Task.Delay(60000) を実行するだけです。
理由を説明できる人はいますか?
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
)。
Task.Delay
1000 (ms) などの低い値をお勧めします。worker ロールが正常性チェックに十分な速さで応答できないのではないかと思います。その後、ロールは応答しないと見なされ、再起動されます。
Run
メソッドがこのようなもので決して返らないことを確認してください
while (true)
{
Thread.Sleep(1000);
}
またはTask.Delay
あなたの場合と一緒に。