Я только изучаю новые библиотеки Threading и Parallel в .Net 4
Раньше я бы создал новый поток, например, так (в качестве примера):
DataInThread = new Thread(new ThreadStart(ThreadProcedure));
DataInThread.IsBackground = true;
DataInThread.Start();
Теперь я могу:
Task t = Task.Factory.StartNew(() =>
{
ThreadProcedure();
});
В чем разница, если она есть?
Спасибо
c#
.net
multithreading
.net-4.0
Джон
источник
источник
Ответы:
Существует большая разница. Задачи планируются в ThreadPool и могут даже выполняться синхронно, если это необходимо.
Если у вас есть длительная фоновая работа, вы должны указать это, используя правильный параметр задачи.
Вам следует предпочесть параллельную библиотеку задач явной обработке потоков, поскольку она более оптимизирована. Также у вас есть больше функций, таких как Продолжение.
источник
Задача дает вам все возможности API задачи:
Task.ContinueWith
)Обратите внимание, что в обоих случаях вы можете немного упростить свой код с помощью преобразований групп методов:
источник
Thread
это очень низкий уровень по сравнению сTask
(у меня есть сообщение в блоге , в котором подробно рассказывается). На Grand Rapids DevDay я выступаю с лекцией «Использование задач в реальном мире» . Обсуждение называется «Поток мертв», потому что в нем больше нет необходимостиThread
(если вы не реализуете aTaskScheduler
).Thread
он мертв, когда дело доходит до использования в качестве фонового потока?Thread
можно сделать (илиBackgroundWorker
) сделать более элегантнымTask
и подходящимTaskScheduler
.Thread
?Task
работать на определенную тему, а затем использовать соответствующийTaskScheduler
- например,AsyncContextThread
. Однако обычно в этом нет необходимости;SynchronizationContext
,ThreadPool
иConcurrentExclusiveSchedulerPair
планировщики достаточно для большинства программ.В первом случае вы просто запускаете новый поток, а во втором - входите в пул потоков.
Задача пула потоков - разделять и повторно использовать потоки. Это позволяет избежать потери нескольких миллисекунд каждый раз, когда нам нужно создать новый поток.
Есть несколько способов войти в пул потоков:
источник
Ваш первый блок кода сообщает CLR создать для вас поток (скажем, T), который можно запустить в фоновом режиме (используйте потоки пула потоков при планировании T). Короче говоря, вы явно просите CLR создать поток, чтобы вы что-то сделали, и вызывали метод Start () в потоке для запуска.
Ваш второй блок кода делает то же самое, но делегирует (неявно передает) ответственность за создание потока (фоновый, который снова запускается в пуле потоков) и начальный поток через метод StartNew в реализации фабрики задач.
Это быстрое различие между данными блоками кода. Сказав это, есть несколько подробных различий, которые вы можете найти в Google или увидеть другие ответы от моих коллег.
источник