использование задач .NET 4 вместо Thread.QueueUserWorkItem - PullRequest
3 голосов
/ 20 июня 2010

Я читал кучу статей о новом TPL в .NET 4. Большинство из них рекомендует использовать Tasks вместо Thread.QueueUserWorkItem.Но из того, что я понимаю, задачи не являются потоками.Итак, что происходит в следующем сценарии, где я хочу использовать очередь Producer / Consumer с использованием нового класса BlockingCollection в .NET 4:

  1. Очередь инициализируется с параметром (скажем, 100), чтобы указать числорабочих задач.Task.Factory.StartNew () вызывается для создания группы задач.

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

Теперь, исходя из вышеизложенного, представляется, что существует ограничение на количество задач, которые вы можете выполнять одновременно, при использовании Thread.QueueUserWorkItem CLR будет использовать пул потоков с размером пула по умолчанию.

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

Делает ли этоимеет смысл использовать очередь производителя / потребителя в этом случае?А как насчет количества рабочих заданий?

1 Ответ

2 голосов
/ 22 июня 2010

Я не уверен, является ли использование очереди «Производитель / Потребитель» лучшим шаблоном, но в отношении проблемы с потоками.Как я верю в это.Задачи .NET4 по-прежнему выполняются как потоки, однако вам не нужно беспокоиться о планировании этих потоков, поскольку .NET4 предоставляет хороший интерфейс для этого.
Основные преимущества использования задач:

  • То, что вы можете поставить в очередь столько из них, сколько захотите, не имея накладных расходов в 1 МБ памяти для каждого рабочего элемента в очереди, который вы передаете Thread.QueueUserWorkItem.
  • Он также управляет тем, на каких потоках и процессорах будут выполняться ваши задачи для улучшения потока данных и кэширования.
  • Вы можете построить иерархию зависимостей для ваших задач.
  • Он автоматически использует максимально возможное количество ядер на вашем компьютере.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...