Task.Delay と Thread.Sleep を使用する場合の適切な規則はありますか。
現在のスレッドをブロックしたい場合はThread.Sleep
を使用してください。
現在のスレッドをブロックせずに論理的な遅延が必要な場合は、Task.Delay
を使用してください。
効率はこれらの方法の最優先事項ではありません。それらの実世界での主な用途は、I/O操作の再試行タイマーであり、ミリ秒ではなく秒のオーダーです。
現在のスレッドが強制終了され、Thread.Sleep
を使用していて実行中の場合は、ThreadAbortException
が返される可能性があります。 Task.Delay
を使えば、いつでもキャンセルトークンを提供して、それを優雅に殺すことができます。私がTask.Delay
を選択する理由の1つはそれだけです。 http://social.technet.Microsoft.com/wiki/contents/articles/21177.visual-c-thread-sleep-vs-task-delay.aspx を参照してください。
この場合、効率性が最優先事項ではないことにも同意します。
何か追加したいのですが。実際、Task.Delay
はタイマーベースの待機メカニズムです。 source を見ると、遅延の原因となっているTimer
クラスへの参照が見つかります。一方、Thread.Sleep
は実際に現在のスレッドをスリープ状態にします。つまり、1つのスレッドをブロックして無駄にしているだけです。非同期プログラミングモデルでは、少し遅れて何か(継続)が起こるようにしたい場合は、常にTask.Delay()
を使うべきです。