Подождите, пока фоновый рабочий завершится, не блокируя основной поток.

Я пытаюсь запустить фоновый рабочий со счетчиком, работающим в основном потоке, и я хотел бы дождаться завершения фонового рабочего. В настоящее время я могу иметь и то, и другое. Я попытался использовать событие автоматического сброса, но это блокирует основной поток, поэтому счетчик не отображается. Есть ли что-то похожее на событие автоматического сброса, которое не блокирует основной пользовательский интерфейс.

Вот часть моего кода

BackgroundWorker _bWorker = new BackgroundWorker();
_bWorker.DoWork += _bWorker_DoWork ;
_bWorker.RunWorkerCompleted += _bWorker_RunWorkerCompleted;

AutoResetEvent are = new AutoResetEvent(false);

_bWorker.RunWorkerAsync();

// Wait here until the background worker is finished
are.WaitOne();

...

private void _bWorker_DoWork(object sender, DoWorkEventArgs e)
{
    // Show spinner
    WaitSpinnerAdornerText = "Working";
    IsWaitSpinnerVisible = true;

    ...

    are.Set();
}


private void _bWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
    IsWaitSpinnerVisible = false;
    ...
}

Есть идеи? Любая помощь приветствуется! Заранее спасибо.


person Miguel    schedule 21.04.2014    source источник
comment
Какую версию .net вы используете?   -  person Sriram Sakthivel    schedule 21.04.2014
comment
Попробуйте переместить are.Set() в Completed   -  person paparazzo    schedule 21.04.2014
comment
@Sriram Я использую .NET 4.0   -  person Miguel    schedule 21.04.2014


Ответы (1)


Весь смысл использования BackgroundWorker заключается в том, что вы не «ждете» его завершения. Просто удалите AutoResetEvent и активируйте любую логику, которая в настоящее время находится после RunWorkerAsync в _RunWorkerCompleted.

В качестве альтернативы вы можете изучить использование библиотеки параллельных задач и запустить этот код как продолжение.

Наконец, вы можете изучить использование Async CTP для .net 4.0, в котором функции async/await ведут себя почти идентично тому, как вы хотите написать код.

person Andrew Hanlon    schedule 21.04.2014