2

ロード中に動作する2 つのバックグラウンド ワーカー スレッドを持つ WPF アプリケーションがあります。

1 つ目 ( bw1 ) はアプリケーションの開始時に生成され、2 つ目 ( bw2 ) は一定の時間が経過した後に生成されます。

最初のバックグラウンド ワーカー ( bw1 ) の "worker_completed"から2 番目のバックグラウンド ワーカー ( bw2 ) を生成できない状況にあります。

現在、クラスレベルの bool 変数 (デフォルトfalse) があり、それtruebw1の worker_completed に設定しています。

bw2の開始時に、上記の bool が false かどうかを確認し、そうであればbw2は 100 ミリ秒間スリープします。

ほとんどの場合、これは機能します。改善したいと思います。

  • bw2がスリープしている間にbw1が確実に実行されるように、 bw1でスレッドの優先度を使用して (最高に設定するなど) できますか?

  • この目標を達成できるイベント駆動型の方法はありますか?

4

1 に答える 1

3

ブラインドチェックを行ってシステムリソースを不必要に使用しているため、イベントがいつ発生するかが実際にわからない場合は、ビジースピン(スリープ状態でも)はお勧めできません。

AutoResetEvent代わりに使用してください。bw2のコード呼び出しの開始時ev.WaitOne()とbw1のbw2を解放するためのwork_completed呼び出しev.Set()

AutoResetEvent ev = new AutoResetEvent();

// bw1's work completed     
private void bw1_workCompleted(object sender, RunWorkerCompletedEventArgs e)
{
    ev.Set(); // release bw2 from waiting
}

// bw2's do work
private void bw2_DoWork(object sender, DoWorkEventArgs e)
{
    ev.WaitOne(); // wait for the signal from bw1
    // code
}
于 2012-03-13T18:12:58.933 に答える