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

С# - ThreadPool vs Tasks

Как некоторые, возможно, видели в .NET 4.0, они добавили новое пространство имен System.Threading.Tasks, которое в основном является тем, что является средством, задачей. Я использую его только несколько дней, используя ThreadPool.

Какой из них более эффективен и менее ресурсоемкий? (Или просто лучше всего?)

4b9b3361

Ответ 1

Цель пространства имен "Задачи" - предоставить подключаемую архитектуру, облегчающую запись приложений с несколькими задачами и более гибкие.

Реализация использует объект TaskScheduler для управления обработкой задач. У этого есть виртуальные методы, которые вы можете переопределить, чтобы создать собственную обработку задач. Методы включают, например,

protected virtual void QueueTask(Task task)
public virtual int MaximumConcurrencyLevel

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

Существует (черновик) реализации настраиваемого TaskScheduler, который реализует несколько задач в одном потоке здесь.

Ответ 2

который более эффективен и менее ресурс?

Не имеет значения, будет очень мало различий.

(или просто лучше всего)

Класс Task будет более простым в использовании, поскольку он предлагает очень чистый интерфейс для запуска и объединения потоков и передает исключения. Он также поддерживает (ограниченную) форму балансировки нагрузки.

Ответ 4

Планирование - важный аспект параллельных задач.

В отличие от потоков новые задачи не обязательно начинаются немедленно. Вместо этого они помещаются в рабочую очередь. Задачи запускаются, когда их связанный планировщик задач удаляет их из очереди, обычно по мере того, как становятся доступными ядра. Планировщик задач пытается оптимизировать общую пропускную способность, контролируя степень системы concurrency. Пока есть достаточно задач, и задачи достаточно свободны от сериализации зависимостей, производительность программы масштабируется с количеством доступных ядер. Таким образом, задачи воплощают концепцию потенциала parallelism

Как я увидел на msdn http://msdn.microsoft.com/en-us/library/ff963549.aspx

Ответ 5

Еще один хороший момент для рассмотрения задачи - когда вы используете ThreadPool, у вас нет возможности прервать или подождать текущие потоки (если вы не делаете это вручную в методе потока), но используя задачу, это возможное. Пожалуйста, поправьте меня, если я ошибаюсь

Ответ 6

Тема

Голая металлическая вещь, вам, вероятно, не нужно ее использовать, вы, вероятно, можете использовать задачу LongRunning и воспользоваться ее возможностями.

Задачи

Абстракция над потоками. Он использует пул потоков (если вы не укажете задачу как операцию LongRunning, если это так, новый поток создается под капотом для вас).

Пул потоков

Как следует из названия: пул потоков. Является ли платформа .NET обработкой ограниченного количества потоков для вас. Зачем? Поскольку открытие 100 потоков для выполнения дорогостоящих операций ЦП на процессоре с 8 ядрами, определенно, не является хорошей идеей. Структура будет поддерживать этот пул для вас, повторно используя потоки (не создавая/убивая их при каждой операции) и выполняя некоторые из них параллельно, так что ваш процессор не будет гореть.

ОК, но когда использовать каждый?

В резюме: всегда используйте задачи.

Задача - это абстракция, поэтому ее намного проще использовать. Я советую вам всегда использовать Tasks, и если вы столкнулись с какой-то проблемой, которая заставит вас обрабатывать поток самостоятельно (вероятно, 1% времени), то используйте потоки.

НО имейте в виду, что:

  • привязка ввода/вывода: для операций с привязкой к вводу/выводу (вызовы базы данных, чтение/запись файлов, вызовы API и т.д.) никогда не использовать обычные задачи, используйте LongRunning задачи или потоки, если вам нужно, но не обычные задачи. Потому что это приведет вас к пулу потоков с несколькими занятыми потоками и множеством других задач, ожидающих своей очереди на пул.
  • Связанный с процессором. Для операций с привязкой к ЦП просто используйте обычные задачи и будьте счастливы.

Ответ 7

Разница между ThreadPool и Task очень проста. Чтобы понять задачу, вы должны знать о пуле потоков.

ThreadPool в основном помогает управлять и повторно использовать бесплатные темы. Другими словами, пул потоков - это коллекция фоновых потоков.

Простое определение задачи может быть:

Задача работы асинхронно управляет единицей работы. Проще говоря, Task не создает новые темы. Вместо этого он эффективно управляет потоками пула потоков. Задачи выполняются TaskScheduler, который ставит задачи в очередь.

Ответ 8

Нить является понятием более низкого уровня. Задача - более высокоуровневая концепция. Задача больше похожа на include создать новый поток и thread.start().

Все новые высокоуровневые API параллелизма, включая методы Parallel.For *(), PLINQ, await и современные асинхронные методы в BCL, все построены на Task. Задача больше связана с вычислением, для которого нужна способность вычислять в CPU.

Когда использовать поток и задачу, это зависит от кода. Мы используем задачи с высокой читабельностью и упрощаем наш код. Это больше удобства.

Согласно этому блогу:

Поток Поток представляет собой текущий поток уровня ОС, со своим собственным стеком и ресурсами ядра. (технически реализация CLR могла бы использовать волокна вместо этого, но ни один из существующих CLR не делает этого). Thread обеспечивает высочайшую степень контроля; Вы можете прервать(), Suspend() или Resume() поток (хотя это очень плохая идея), вы можете наблюдать за его состоянием и устанавливать свойства уровня потока, такие как размер стека, состояние квартиры или культура.

ThreadPool ThreadPool - это обертка вокруг пула потоков, поддерживаемых CLR. ThreadPool не дает вам никакого контроля вообще; Вы можете отправить работу для выполнения в определенный момент, и вы можете контролировать размер пула, но вы не можете установить что-либо еще. Вы даже не можете сказать, когда пул начнет выполнять работу, которую вы ему отправляете. Использование ThreadPool позволяет избежать накладных расходов на создание слишком большого количества потоков.

Задача Наконец, класс Task из библиотеки параллельных задач предлагает лучшее из обоих миров. Как и ThreadPool, задача не создает свой собственный поток ОС. Вместо этого задачи выполняются TaskScheduler; планировщик по умолчанию просто запускается в ThreadPool.

В отличие от ThreadPool, Task также позволяет вам узнать, когда он заканчивается, и (через обычную Task) вернуть результат. Вы можете вызвать ContinueWith() для существующей Задачи, чтобы она выполняла больше кода после завершения задачи (если она уже завершена, она немедленно выполнит обратный вызов). Если задача является общей, ContinueWith() передаст вам результат задачи, что позволит вам запустить больше кода, который ее использует.

Пожалуйста, обратитесь к блогу для более подробной информации