.NET 4.5 および Async CTP 4.0 のawaitを含むフローは、リモート クライアントが応答しないなど、さまざまな理由でスタックする可能性があります。もちろん、一部のタイムアウト タスクも待機する WaitForAny は、高レベル フローを回復するための明らかなソリューションです。それでも、これですべての問題が解決するわけではありません。
次の質問があります。
戻らないawaitのコンテキストはどうなりますか? これによりメモリリークが発生することを理解しています。私は正しいですか?
デバッガーで、またはそれぞれの API を使用して、アプリケーションにぶら下がっている「awaiter」がいくつ存在するかを確認するにはどうすればよいですか?
それらをグローバルに列挙することは可能ですか?
3. が正しい場合、これらの*await * のタスクを強制的にキャンセルする (つまり、クリーンアップする) ことは可能ですか?
注: 質問 4 では、明示的なタスクの作成中に使用されるキャンセル項目については質問しません。タスクが間接的に作成された場合を意味します。
async Task<bool> SomeTask()
{
await Something();
...
return true;
}
この質問の動機:
- メモリリークを回避しようとしています
- キャンセルトークンを含むケースが多すぎてコードを複雑にしようとしています
- 多くの場合、各低レベル タスクのタイムアウトは事前にわかりませんが、高レベル フローでは回復アプローチのみを使用できます。