Создание потоков-задача.Фабрика.StartNew против новой темы()
Я только что узнал о новых потоковых и параллельных библиотеках в .Net 4
в прошлом я бы создал новый поток вот так (в качестве примера):
DataInThread = new Thread(new ThreadStart(ThreadProcedure));
DataInThread.IsBackground = true;
DataInThread.Start();
теперь я могу сделать:
Task t = Task.Factory.StartNew(() =>
{
ThreadProcedure();
});
в чем разница, если таковые имеются?
спасибо
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 или увидеть другие ответы от моих коллег-участников.