Диспетчер, BackgroundWorker или Параллель? - PullRequest
1 голос
/ 03 декабря 2011

В рамках изучения C # я пишу небольшое приложение, которое просматривает список прокси.Для каждого прокси он создаст httpwebrequest для proxytest.php, который печатает общие данные о данном прокси (или нет, в этом случае прокси отбрасывается)

Очевидно, что код веб-запроса должен выполняться вотдельный поток - тем более, что я планирую просматривать довольно большие списки.Но даже в отдельном потоке прохождение 5000 прокси займет вечность, поэтому я думаю, что это означает, что я должен создать несколько потоков (поправьте меня, если я ошибаюсь)

Я просмотрел учебники по MSDN и случайным потокам идоступно несколько разных классов.В чем разница между диспетчером, фоновым работником и параллелью?Мне дали этот фрагмент:

Parallel.ForEach(URLsList, new ParallelOptions() { MaxDegreeOfParallelism = S0 }, (m, i, j) =>
  {
    string[] UP = m.Split('|');
    string User = UP[0];
    string Pass = UP[1];
 // make call here
 }

Я не совсем уверен, чем он отличается от того, что может сделать запуск 5 отдельных фоновых работников.

Так в чем же разница между этими тремя ичто было бы хорошим (простым) подходом к этой проблеме?

Спасибо

Ответы [ 2 ]

3 голосов
/ 03 декабря 2011

Dispatcher - это объект, который моделирует цикл сообщений приложений WPF. Если это ничего не значит для вас, то забудьте, что вы когда-либо слышали об этом.

BackgroundWorker - это вспомогательный класс для потока, который является частью управляемого пула потоков . Он существует для предоставления некоторых обычно запрашиваемых функций, помимо ручного назначения работы пулу потоков с помощью ThreadPool.QueueUserWorkItem.

Класс Thread очень похож на использование пула управляемых потоков, с той разницей, что вы полностью контролируете время жизни потока (с другой стороны, это хуже, чем использование потока пул, если вы собираетесь запустить много коротких задач).

Параллельная библиотека Task (TPL) (т. Е. Использование Parallel.ForEach) действительно будет лучшим подходом, поскольку она не только заботится о назначении рабочих единиц нескольким потокам (из управляемого потока) пул), но он также автоматически поделит рабочие единицы между этими потоками.

1 голос
/ 03 декабря 2011

Я бы сказал, используйте параллельную библиотеку задач. Это новая библиотека, объединяющая весь ручной код, который вы должны будете написать иначе.

Task Parallel Library (TPL) - это коллекция новых классов, специально разработанных для упрощения и повышения эффективности выполнения очень мелких параллельных рабочих нагрузок на современном оборудовании. В течение некоторого времени TPL был доступен отдельно как CTP и был включен в CTP-версию Visual Studio 2010, но в этих выпусках он был построен на собственном специальном планировщике работы. Для бета-версии 1 CLR 4.0 планировщиком по умолчанию для TPL будет пул потоков CLR, который позволяет рабочим нагрузкам в стиле TPL «хорошо играть» с существующим кодом на основе QUWI и позволяет нам повторно использовать большую часть базовой технологии в пул потоков - в частности, алгоритм внедрения потоков, который мы обсудим в следующем посте.

от

http://blogs.msdn.com/b/ericeil/archive/2009/04/23/clr-4-0-threadpool-improvements-part-1.aspx

Мне было очень легко работать с этой новой 4 библиотекой. В этом блоге показан старый способ ведения дел BackgroundWorker и новый способ выполнения задач Task.

http://nitoprograms.blogspot.com/2010/06/reporting-progress-from-tasks.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...