Как я могу обеспечить выполнение определенного фонового рабочего потока перед другим? - PullRequest
2 голосов
/ 13 марта 2012

У меня есть приложение WPF с двумя фоновыми рабочими потоками, которые работают во время загрузки.

Первый ( bw1 ) создается при запуске приложения, ивторой ( bw2 ) создается по прошествии некоторого времени.

Я нахожусь в ситуации, когда я не могу вызвать второго фонового работника ( bw2 ) изпервый ( bw1 ) "worker_completed".

В настоящее время у меня есть переменная bool уровня класса (по умолчанию false), и я установил ее true в bw1 'worker_completed.

И при запуске bw2 у меня есть проверка, чтобы проверить, является ли указанное выше значение bool ложным, и если да, bw2 будет спать в течение 100 миллисекунд.

Это работает, по большей части.Я хотел бы улучшить его.

  • Могу ли я использовать приоритет потока в bw1 (скажем, установить его как наивысший), чтобы bw1 выполняется, пока bw2 спит?

  • Есть ли способ, которым я могу достичь этой цели?

1 Ответ

4 голосов
/ 13 марта 2012

Занятое вращение (даже во сне) - плохая идея, когда вы на самом деле не знаете, когда произойдет событие, поскольку вы проверяете вслепую и без необходимости используете системные ресурсы.

Используйте взамен AutoResetEvent. В начале кода bw2 позвоните ev.WaitOne(), а в bw1 work_completed позвоните ev.Set(), чтобы освободить bw2:

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
}
...