Различия различными способами сделать параллельные программы

Что является различием между:

  1. Начинание новой дискуссии
  2. Использование TPL
  3. Использование BackgroundWorker

Все они создают параллелизм, но каковы различия низкого уровня между ними? Все 3 делают потоки так или иначе?

Спасибо

10
задан John Saunders 12 May 2010 в 19:48
поделиться

3 ответа

Все они используют потоки внутри, различия связаны с уровнем абстракции каждого API и тем, как используются потоки. Давайте немного переупорядочим ваш список и рассмотрим три метода от самого низкого до самого высокого уровня абстракции:

  1. Запуск нового потока вручную :

    Фактически это создает новый поток в ОС. Ваш код будет выполнен в этом потоке.

  2. Использование BackgroundWorker :

    Внутри используется нечто, называемое .net ThreadPool . Пул потоков - это в основном пул доступных потоков. Ваш код назначается одному из доступных потоков и запускается в этом потоке.

    Пул управляет количеством доступных потоков и будет внутренне создавать и уничтожать потоки по мере необходимости в определенных пределах. Это полезно, потому что в пуле могут быть некоторые алгоритмы для оптимизации создания потоков. Создание потока - довольно дорогостоящий процесс, поэтому при необходимости пул потоков поддерживает потоки и повторно использует их для будущих запросов.Вы можете иметь некоторый ограниченный контроль над пулом, указав минимальное / максимальное количество потоков и некоторые подобные незначительные настройки.

    Существуют и другие способы использования ThreadPool напрямую, например QueueUserWorkItem (...) .

  3. Использование библиотеки параллельных задач :

    Это еще более высокая абстракция. Вы создаете «задачи» и говорите TPL выполнить их. TPL скрывает все опасения относительно того, сколько именно потоков и какие приоритеты будут использоваться и т. Д. TPL имеет возможность повторно использовать потоки и управлять ими в соответствии с производительностью конкретной машины и доступными ресурсами ЦП.

    Например, для 100 задач на ядре Quad TPL может порождать 4 потока, но на 8 ядрах он может порождать 8 и распределять задачи по доступным потокам по мере завершения каждой задачи.

Итак, чтобы ответить на ваш вопрос. Все 3 метода используют потоки, но по мере того, как вы поднимаетесь на каждый уровень, степень контроля и осведомленности, которые вы имеете над этими потоками, уменьшается.

В большинстве случаев я бы рекомендовал вам использовать TPL. Если вам не нужен конкретный очень точный контроль над количеством потоков и их созданием / уничтожением, TPL справится со всем этим очень хорошо для вас.

19
ответ дан 3 December 2019 в 16:51
поделиться
  1. Запуск нового потока - самый затратный из трех, но вы получаете наибольшие возможности. Как и установка модели квартиры и приоритета.

  2. Библиотека параллельных задач запускает задачу в пуле потоков (если задача не помечена как требующая собственного потока) и добавляет функции обработки исключений и ожидания завершения.

  3. BackgroundWorker полезен только для выполнения задач, порожденных WinForms или WPF. Он также использует Threadpool

  4. Extra: ThreadPool . Используется для выполнения коротких задач без накладных расходов на создание отдельного потока.

3
ответ дан 3 December 2019 в 16:51
поделиться

Создание потока - это просто ... вы создаете один поток, который будет выполняться одновременно с потоком вашего основного процесса.

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

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

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

2
ответ дан 3 December 2019 в 16:51
поделиться
Другие вопросы по тегам:

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