2013-06-07 39 views
14

まず、C# - Alternative to Thread.Sleep?、またはAlternative to Thread.Sleep in C#?と同じ質問をしません。私はそれを間違って使用しているとは思わないし、特定の状況のた​​めの真の選択肢が必要です。私は意外な違反がアップ来るのを見コード分析の実行中に待機のためにThread.Sleepを使用する代わりに

:のThread.sleepの

使用法は()欠陥設計のサインです。

この違反は、なぜ正確にこれが悪い設計であるかについて、Peter Richie's articleにつながります。

スレッドの作成は高価で、スレッドでのブロックはプールの競合を意味します。私たちはまた、各スレッドがメモリのメグを割り当てるので、寿命が短く、UIをブロックするのが悪いことを知っています。タイミングのためにスリープを使用するなど信頼性が低いなどなど。あなたがThread.Sleepでないなら、あなたは何を使用すべきですか?

Peterは、Thread.Sleepの唯一の正しい使用が、スレッドのタイムスライスを効果的に諦め、他のスレッドが処理できるようにすることを言及しています。さらに、これは管理されていないスレッドの制限が原因であり、CLRに再実装された場合、アプリケーションでThread.Sleepを使用することによる副作用が発生することになります。よくある悪い使い方のすべての点は、悪い使い方の良い例です。

私はかなり成功したのThread.sleep使用する製品コードに次のような状況があります。第二のためのオペレーティングシステム(キャッチファイルロックの問題、待機により放棄されるファイルロックを待機

  • を、もう一度やり直す、しばらくしてから)。
  • プロセスを強制終了し、プロセスリストに表示されなくなるのを待っています(強制終了、実行していないことを確認してください。)。を待ちます。
  • コピーバッファがフラッシュするのを待っています(ファイルサイズを確認してください)。を待ちます。、サイズが変更されているかどうかを確認してください。

このような状況でThread.Sleepを使用しないと、他にどのようなオプションがありますか?タイトなループは事態を悪化させがちですが、これはUI上やバックグラウンドスレッド内に何もないので、これが "設計上の欠陥"となるとは思わないでしょう。コードに影響を及ぼす外的要因を持つマルチスレッド環境で他のものを待つことは、たぶん待つ必要があります...

+1

、のThread.sleep必然ですか?それを使ってください。しかし、私はそれを使用することは決してありません。 – I4V

+0

Peterの記事には多くの良い点がありますが、それは間違っているという事実を許すものではありません。 –

答えて

関連する問題