web-dev-qa-db-ja.com

Thread.SleepまたはThread.Yield

私は、バックグラウンドワーカーを使用してDLL=をポーリングして、次のようなステータスを確認する方法があります。

_var timeout = DateTime.Now.AddSeconds(3);
while (System.Status != Status.Complete  // our status is not complete
       && DateTime.Now < timeout         // have not timed out
       && !_Worker.CancellationPending)  // backgroundworker has not been canceled
{
    //Thread.Yield();
    //Thread.SpinWait(1);
    //Thread.Sleep(1);
}
_

CPU%を見ると、yield()spinwait()により、アプリがPCで最大50%の割合で撮影されます。 Sleep(1)を使用すると、私のCPU%は6%のままです。 Thread.Yield()を選択するように言われましたが、CPUのスパイクが気になります。このようなもののベストプラクティスは何ですか?

27
poco

Thread.Yield は、現在のスレッドを中断して、他のスレッドが機能できるようにします。ただし、実行する作業がない場合、スレッドはすぐに再スケジュールされ、ポーリングを続行するため、1コアの使用率は100%になります。

呼び出し元のスレッドが、現在のプロセッサで実行する準備ができている別のスレッドに実行を譲ります。オペレーティングシステムは、譲るスレッドを選択します。

Thread.Sleep は、スリープ時間が経過した後にスレッドが再度実行されるようにスケジュールするため、CPU使用率が大幅に低下します。

指定されたミリ秒の間、現在のスレッドをブロックします。

この2つから選択すると、Thread.Sleepがタスクにより適しています。ただし、Threading.Timerがよりエレガントなソリューションを提供するという@Bryanからのコメントに同意します。

27
Eric J.