チャットでの長い議論と多くの掘り下げに基づくと、いくつかのあいまいなシナリオでは、.TrySetResult
のようなことをしているときに、TPLが専用のリーダースレッドを乗っ取っているようです。 (これは:私たちは頻繁に行います)。これにより、同期呼び出しを行うと瞬時にデッドロックが発生します。これは、タスクの完了を待機している場合(それ自体でのみ完了する)、ソケットデータを処理できない可能性があるためです。実際には、これを防ぐために特にコードを配置しています。 、しかし回避策は実際には強制のようです 他のいくつかのシナリオで発生します。これは...恐ろしいです。私は私が見つけることができるものを見るでしょう。しかし、基本的に、問題は現在 、一部の限定されたシナリオ 、TaskCompletionSource.TrySetResult
同期継続を実行するためにTPLに電力を供給しています。これには、Task.WhenAny
が含まれます 。