2012-05-16 8 views
1

Im чтение книги WPF, и я вижу этот код:UI нить против BackgroundWorker нить

private void bgw1_ProgressChanged(object sender, ProgressChangedEventArgs e) 
    { 
     int percenti; 
     percenti = e.ProgressPercentage; 
     progressBar1.Value = percenti; 
    } 

вопрос прост. если

ProgressBar принадлежит УЙ теме и BackgroundWorker работает с фоновой темой

Почему не являются там никаких ошибок (например: Вызывающий поток не может получить доступ к этому объекту, потому что другой поток владеет.)?

спасибо.

ответ

3

Почему нет ошибок (например: вызывающий поток не может получить доступ к этому объекту, потому что ему принадлежит другой поток.)?

Это одно из главных преимуществ использования BackgroundWorker. Компонент BackgroundWorker автоматически маршалирует запрос о прогрессе и завершении обратно в контекст синхронизации (поток), который запускает задание.

В этом случае это означает, что обработчики событий для ProgressChanged (и события завершения) происходят в потоке пользовательского интерфейса WPF.

2

BackgroundWorker обрабатывает контекст контекста потока для вас. Событие BackgroundWorker.ProgressChanged будет поднято на UI-Thread, и, следовательно, ваш обратный вызов bgw1_ProgressChanged будет вызываться в контексте UI-Thread.

Это была основная цель для существования BackgroundWorker: Чтобы сделать асинхронную работу простой и прямой в сочетании с пользовательским интерфейсом.

BackgroundWorker есть с .NET 1.0. Теперь, когда мы живем в 2012 году, у нас есть класс Task и Task Parallel Library, и вскоре ключевое слово C# async как общее средство для всего асинхронного использования, которое делает BackgroundWorker видом устаревшей или, по крайней мере, старой школы.

Смежные вопросы