C # – ThreadPool vs Tasks

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

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

objective пространства имен «Задачи» заключается в предоставлении подключаемой архитектуры для упрощения написания многозадачных приложений и более гибкой.

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

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

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

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

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

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

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

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

«Начиная с .NET Framework 4, TPL является предпочтительным способом написания многопоточного и параллельного кода».

http://msdn.microsoft.com/en-us/library/dd460717.aspx

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

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

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

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

Нить

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

Задания

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

Пул сообщений

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

Хорошо, но когда использовать каждый?

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

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

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

  • Ограничение ввода-вывода : для операций с LongRunning (вызовы базы данных, чтения / записи файлов, вызовы API-интерфейсов и т. Д.) Никогда не используют обычные задачи , используйте задачи или streamи LongRunning если это необходимо, но не обычные задачи. Потому что это приведет вас к пулу streamов с несколькими занятыми streamами и множеством других задач, ожидающих своей очереди на пул.
  • CPU Bound : для операций с привязкой к ЦП просто используйте обычные задачи и будьте счастливы.
  • Установите ApartmentState на задание
  • Исключение (исключения) задачи не наблюдалось ни при ожидании задачи, ни при доступе к ее свойству Exception. В результате необнаруженное исключение было
  • Как включить tags задач TODO / FIXME / XXX в Eclipse?
  • Что используется для Task.FromResult в C #
  • Как работают убийцы задач?
  • System.Threading.Tasks - ограничение количества одновременных задач
  • Давайте будем гением компьютера.