BackgroundWorker обеспечивает реальную многопоточность?

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

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

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

5
задан rem 13 February 2010 в 13:39
поделиться

3 ответа

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

Преимущество 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();
11
ответ дан 18 December 2019 в 10:44
поделиться

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

3
ответ дан 18 December 2019 в 10:44
поделиться

если стрипо ($ _ SERVER ['HTTP _ USER _ AGENT'], «mozilla»)! = = false)

Это не полезный тест, почти каждый браузер идентифицирует себя как Mozilla.

является $ _ SERVER ['HTTP _ USER _ AGENT'] надежным способом?

Нет.

Вместо этого следует выбрать функцию get_browser?

Нет.

Поиск в браузере на стороне сервера является проигрышной игрой. Помимо всех проблем, связанных с попыткой синтаксического анализа последовательности UA, браузеры, которые лежат, неясные браузеры и возможность того, что заголовка там нет, при возврате другого содержимого страницы для другого браузера необходимо установить заголовок Vary , включающий User-Agent , в противном случае кэширование прокси-серверов может вернуть неверную версию страницы в неправильный браузер.

Но при добавлении Vary: User-Agent поврежденный код кэширования IE путается и каждый раз перезагружает страницу. Так ты не можешь победить.

Если вы должны искать браузер, то это место на стороне клиента, используя JavaScript и, в частности, в случае IE, условные комментарии. Повезло, что это IE, который поддерживает условные комментарии, так как это один браузер, для которого часто нужны обходные пути. (Наиболее распространенную стратегию см. в ответе scunliffe.)

-121--2058106-

Каждый 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();
-121--4631696-

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

2
ответ дан 18 December 2019 в 10:44
поделиться
Другие вопросы по тегам:

Похожие вопросы: