私のアプリケーションが凍結した後、Task.Delay()
(または.NET 4.0のTaskEx.Delay()
)によって作成されたタスクを待っているスレッドの原因を追跡しました。そのために、TimeSpan
が計算されたTimeSpan
が発生しました。 TotalMilliseconds
が-1
以下であり、-2
より大きい(すなわち、-10000〜-19999ティックの間の任意の場所)。なぜTask.Delay()は無限の遅延を許しますか?
設定することで、(あなたが-2
ミリ秒以下である負TimeSpan
通過したときに、この方法が正しくArgumentOutOfRangeException
投げていますが、上記の範囲からの負のTimeSpanを提供する場合、それが完了したことがないTask
返すことが表示されます下にあるSystem.Threading.Timer
からdueTime
の-1は無限大を表す)。つまり、そのタスクに設定された継続は決して実行されず、にある.Wait()
に起こった貧弱なスレッドは永遠にブロックされます。
完了していないTask
には、どのような可能性がありますか?誰もそのような戻り値を期待するだろうか?その特別な範囲の値を含む、負の値が.Delay()
に渡されるべきでない場合は、ArgumentOutOfRangeException
を投げる?
MSDNのドキュメントでは-1を明示的に使用しているため、正しく動作しているようです。そのオーバーロードのユースケースについては不明ですが、キャンセルトークンを使用するオーバーロードによる「キャンセル」のキャンセルを待つ方法になる可能性があります。 –
@James:-1を明示的に指定するのではなく、-1より小さい値を許可しないことは明白です。 'System.Threading.Timer'のドキュメンテーションとは異なり、-1を渡すと何が起こるかは言いません。文書化された例外リストがソースコードから自動的に生成されたようです。そして、あなたが 'キャンセル'を待っているなら、なぜ 'Task.Delay()'を呼び出すのですか? –
あなたはそれが壊れていると思ったら、接続時にバグを報告してください。 "-1より小さい"と書かれた文書は、-1が有効であると言って明白です(私に)。インテントが-1だった場合、無効な「0未満は無効です」と書く方が簡単でした。ドキュメントとコードの両方で-1が許されているので、これはBy Designだと思うが、BCLチームがランダムなSOスレッドよりも処理する可能性が高いので、バグをファイルに残すように気をつけてください:) –