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