Создание потоков - Task.Factory.StartNew vs new Thread()

Я просто узнаю о новых библиотеках Threading и Parallel в .Net 4

В прошлом я бы создал новый поток вроде этого (в качестве примера):

DataInThread = new Thread(new ThreadStart(ThreadProcedure));
DataInThread.IsBackground = true;
DataInThread.Start();

Теперь я могу сделать:

Task t = Task.Factory.StartNew(() =>
{
   ThreadProcedure();
});

В чем разница?

Спасибо

Ответ 1

Есть большая разница. Задачи запланированы на ThreadPool и могут даже выполняться синхронно, если они соответствуют.

Если у вас есть работа в фоновом режиме, вы должны указать это с помощью правильной опции задачи.

Вы должны предпочесть параллельную библиотеку задач над явной обработкой потоков, поскольку она более оптимизирована. Также у вас есть дополнительные функции, такие как Continuation.

Ответ 2

Задача дает вам всю полезность API-интерфейса задачи:

  • Добавление продолжений (Task.ContinueWith)
  • Ожидание выполнения нескольких задач (всех или любых)
  • Захват ошибок в задаче и допрос их позже
  • Захват отмены (и позволяет вам указать отмену для начала)
  • Потенциально возвращаемое значение
  • Использование ожидания в С# 5
  • Улучшенный контроль над планированием (если он будет длительным, скажем так, когда вы создаете задачу, чтобы планировщик задач мог принять это во внимание)

Обратите внимание, что в обоих случаях вы можете сделать код немного проще с преобразованиями групп методов:

DataInThread = new Thread(ThreadProcedure);
// Or...
Task t = Task.Factory.StartNew(ThreadProcedure);

Ответ 3

В первом случае вы просто начинаете новый поток, а во втором случае вы вводите пул потоков.

Задача thread pool - делиться и перерабатывать потоки. Это позволяет избежать потери нескольких миллисекунд каждый раз, когда нам нужно создать новый поток.

Существует несколько способов ввода пула потоков:

  • с TPL (параллельная библиотека задач), как вы делали
  • вызывая ThreadPool.QueueUserWorkItem
  • вызывая BeginInvoke для делегата
  • когда вы используете BackgroundWorker

Ответ 4

Ваш первый блок кода сообщает CLR создать Thread (например T) для вас, который можно запустить как фон (использовать потоки пула потоков при планировании T). Вкратце, вы явно просите CLR создать поток для вас, чтобы что-то сделать, и запустить метод Start() в потоке.

Второй блок кода выполняет то же самое, но делегирует (неявно передавать) ответственность за создание потока (background, который снова запускается в пуле потоков), и начальный поток через метод StartNew в реализации Task Factory.

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