Подтвердить что ты не робот

В чем разница между Task и Thread?

Сегодня я копал TPL и нашел новый класс Task.Now, я просто хотел узнать, что такое различие между задачей и Thread, а какая лучше?

4b9b3361

Ответ 1

что такое различие между задачей и потоком?

Предположим, что у вас работает компания по доставке книг. У вас есть четыре машины и четыре водителя. Автомобиль - это поток, драйвер - это процессор, а доставка книг - это задача. Проблема, с которой вы сталкиваетесь, заключается в том, как эффективно планировать драйверы и автомобили, чтобы задачи выполнялись как можно быстрее.

Там, где все странно, когда есть больше машин (потоков), чем драйверы (процессоры). То, что происходит тогда, находится на полпути через поездку, водитель припарковывает один автомобиль (приостанавливает нить) и попадает в другую машину (переключает контекст), управляет тем, что работает, выполняя задачи, а затем в конце концов возвращается к первому автомобилю. Очевидно, что это не так эффективно, как один водитель, остающийся в одном автомобиле.

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

какой из них лучше, задача или поток?

На вопрос нельзя ответить, потому что это не имеет никакого смысла. Что лучше, книга для доставки клиенту или автомобиль, чтобы доставить его? Автомобиль - это устройство, которое можно использовать для доставки книги; эти две вещи - это не то, что вы можете разумно назвать "лучше" или "хуже", чем другое. Это как просить "что лучше, отверстие или дрель?"

Ответ 2

"Задача" - это часть работы, которая будет выполняться и завершаться в какой-то момент в будущем.

"Thread" - это то, как что-то выполняется.

Обычно, когда вы создаете задачу, по умолчанию (т.е. используя Task.Factory.StartNew), Task будет запускать Scheduled для потока ThreadPool в какой-то момент. Однако это не всегда так.

Преимущество этого разделения заключается в том, что вы разрешаете структуру (или самостоятельно, если используете пользовательский TaskScheduler), чтобы контролировать, как ваша работа сопоставляется с доступными потоками. Как правило, у вас будет гораздо больше рабочих элементов, чем потоков - у вас может быть один миллион элементов для обработки, но всего 8 ядер в вашей системе. В такой ситуации гораздо эффективнее использовать фиксированное количество потоков, и каждый поток обрабатывает несколько элементов работы. Отделяя "Задачу" от "Thread", вы нарушаете эту связь работы == thread.

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

Ответ 3

Вот некоторые отличия:

  • Task по умолчанию использует пул потоков, а при использовании Thread требуется создать новый поток.
  • Task будет обрабатывать исключения и результаты, поэтому проще использовать его.
  • Task может поддерживать отмену при использовании потоков, вы должны реализовать его самостоятельно.

Ответ 4

A Задача означает действие или работу, которые вы хотите выполнить.

A Thread может быть одним из работающих или работающих perforimg, которые работают.

Ответ 5

В соответствии с справочной документацией MSDN:

Параллельная библиотека задач (TPL) представляет собой набор общедоступных типов и API-интерфейсов в пространствах System.Threading и System.Threading.Tasks в .NET Framework версии 4. Цель TPL - сделать разработчиков более продуктивными с помощью упрощая процесс добавления приложений parallelism и concurrency. TPL масштабирует степень concurrency динамически, чтобы наиболее эффективно использовать все доступные процессоры. Кроме того, TPL обрабатывает разделение работы, планирование потоков на ThreadPool, поддержку отмены, управление состоянием и другие детали низкого уровня. Используя TPL, вы можете максимизировать производительность своего кода, сосредоточившись на работе, которую ваша программа должна выполнить.

Итак, кажется, что Task является предпочтительным средством кодирования асинхронной операции, так как большая часть работы позаботится рамки. Но, с другой стороны, Thread по-прежнему доступен для существующего кода и для случаев, когда вы явно хотите выделить и управлять потоком ОС.