Создание потоков-задача.Фабрика.StartNew против новой темы()


Я только что узнал о новых потоковых и параллельных библиотеках в .Net 4

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

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

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

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

в чем разница, если таковые имеются?

спасибо

4 93

4 ответа:

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

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

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

задача дает вам всю доброту задачи API:

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

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

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

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

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

есть несколько способов войти в пул потоков:

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

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

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

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