Обеспечивает ли BackgroundWorker реальную многопоточность? - PullRequest
5 голосов
/ 13 февраля 2010

Обучение созданию многопоточных приложений WPF Я читал о некоторых ограничениях в использовании BackgroundWorker, которые мне не очень понятны. Пожалуйста, помогите мне понять:

Если я хочу, чтобы не только один поток работал за кулисами пользовательского интерфейса, но, может быть, несколько потоков, начинающихся и заканчивающихся независимо друг от друга, подойдет ли в этом случае BackgroundWorker? Могу ли я иметь несколько экземпляров BackgroundWorker?

Проще говоря, обеспечивает ли BackgroundWorker многопоточность, а не просто двухпоточность?

Ответы [ 4 ]

11 голосов
/ 13 февраля 2010

Каждый BackgroundWorker работает в отдельном потоке. Вы можете создать столько фоновых рабочих, сколько вам нужно для параллельного выполнения операций, поэтому в этом смысле это настоящая многопоточность.

Преимущество BackgroundWorker заключается в простоте подписки на события, которые будут запускаться в потоке пользовательского интерфейса при завершении трудоемкой задачи.

Использование BackgroundWorker на самом деле довольно просто:

var worker1 = new System.ComponentModel.BackgroundWorker();
worker1.DoWork += (sender,e) => Thread.Sleep(10000);
worker1.RunWorkerCompleted += (sender,e) => MessageBox.Show("Worker1 Finished!");
worker1.RunWorkerAsync();
3 голосов
/ 13 февраля 2010

Ограничения, которые вы цитируете (из Pro WPF), проистекают из того факта, что BGW использует ThreadPool, поэтому применяются все правила и советы , касающиеся потоков ThreadPool.

2 голосов
/ 13 февраля 2010

Если вы создаете много экземпляров BackgroundWorker, вы получаете много потоков, однако один экземпляр предусматривает только одну фоновую задачу.

0 голосов
/ 13 октября 2010

Да, внутренне, фоновый работник вызывает BeginInvoke на предоставленном вами делегате. Это приведет к тому, что ваш делегат будет помещен в пул потоков в CLR.

...