Ответ 1
Все они используют потоки внутри, различия связаны с уровнем абстракции каждого API и тем, как используются потоки. Давайте немного переупорядочим ваш список и рассмотрим три метода от самого низкого до самого высокого уровня абстракции:
-
Запуск нового потока вручную:
Это фактически создает новый поток в ОС. Ваш код будет выполнен в этом потоке.
-
Использование BackgroundWorker:
Внутри этого используется то, что называется .net ThreadPool. Пул потоков - это пул доступных потоков. Ваш код присваивается одному из доступных потоков и запускается в этом потоке.
Пул управляет количеством доступных потоков и внутренне создает и уничтожает потоки по мере необходимости в определенных пределах. Это полезно, потому что пул может иметь некоторые алгоритмы для оптимизации создания потоков. Создание потоков - довольно дорогостоящий процесс, поэтому, если это необходимо, пул потоков сохраняет потоки живыми и повторно использует их для будущих запросов. У вас может быть ограниченный контроль над пулом, указав минимальные/максимальные числа потоков и некоторые незначительные настройки вроде этого.
Существуют другие способы непосредственного использования ThreadPool, такие как QueueUserWorkItem (...).
-
Использование параллельной библиотеки задач:
Это еще более высокая абстракция. Вы создаете "задачи" и говорите, что TPL их выполняет. TPL скрывает все проблемы относительно того, сколько потоков и какие приоритеты будут использоваться и т.д. TPL имеет возможность повторно использовать потоки и управлять ими в соответствии с конкретной производительностью компьютера и доступными ресурсами ЦП.
Например, если задано 100 задач, на четырехъядерном ядре TPL может появиться 4 потока, но на 8 ядре он может появиться 8 и распределить задачи по доступным потокам по мере завершения каждой задачи.
Итак, чтобы ответить на ваш вопрос. Все 3 метода используют потоки, но по мере того, как вы поднимаетесь на каждый уровень, количество контроля и понимания, которое вы имеете над этими потоками, уменьшается.
В большинстве случаев я бы рекомендовал использовать TPL. Если вам не нужен конкретный очень точный контроль над количеством потоков и их созданием/уничтожением, TPL справится с этим очень хорошо для вас.