Обучение создать многопоточность приложения WPF, которые я прочитал о некоторых ограничениях в использовании BackgroundWorker, который не был очень ясен для меня. Помогите мне понять:
Если я захочу не только один поток, работающий позади сцены UI, но возможно нескольких, начиная и заканчиваясь независимо один от другого, то BackgroundWorker поместится в такой случай? У меня может быть несколько экземпляров BackgroundWorker?
Проще говоря, BackgroundWorker обеспечивает многопоточность и не просто с двумя поточными обработками?
Каждый 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();
Указанные вами ограничения (из Pro WPF) проистекают из того факта, что BGW использует ThreadPool, поэтому все правила и рекомендации относительно потоков ThreadPool действительно применяются.
если стрипо ($ _ 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
получается множество потоков, однако один экземпляр предоставляет только одну фоновую задачу.