Система. Поточная обработка. Задачи - Предел количество параллельных Задач

Я только что начал смотреть на новую "Систему. Поточная обработка. Задачи" совершенство в.Net 4.0, и хотели бы знать, существует ли какая-либо сборка в поддержке ограничения количества параллельных задач, которые работают сразу, или если это должно быть вручную обработано.

НАПРИМЕР: Если я должен назвать метод расчета 100 раз, есть ли способ настроить 100 Задач, но иметь только 5 выполняются одновременно? Ответ может просто быть должен создать 5 задач, назвать Задачу. WaitAny, и создают новую Задачу как каждый предыдущие концы. Я просто хочу удостовериться, что я не пропускаю прием, если существует лучший способ сделать это.

В основном есть ли созданный способом сделать это:

Dim taskArray() = {New Task(Function() DoComputation1()),
                   New Task(Function() DoComputation2()),
                   ...
                   New Task(Function() DoComputation100())}

Dim maxConcurrentThreads As Integer = 5
RunAllTasks(taskArray, maxConcurrentThreads)

Спасибо за любую справку.

43
задан James 24 May 2010 в 18:47
поделиться

3 ответа

Не похоже, хотя вы могли бы создать подкласс TaskScheduler, реализующий такое поведение.

0
ответ дан 26 November 2019 в 22:48
поделиться

Краткий ответ: Если вы хотите ограничить количество рабочих задач, чтобы они не перегружали ваш веб-сервис, то я думаю, что ваш подход подходит.

Длинный ответ: Новый механизм System.Threading.Tasks в .NET 4.0 работает поверх .NET ThreadPool. Поскольку существует только один пул потоков для каждого процесса и по умолчанию максимальное количество рабочих потоков составляет 250. Следовательно, если вы установили максимальное количество потоков ThreadPool на более скромное значение, вы сможете уменьшить количество одновременно выполняемых потоков и, следовательно, задач, используя ThreadPool.SetMaxThreads (...) API.

ОДНАКО, обратите внимание, что вы, возможно, не одиноки в использовании ThreadPool, поскольку многие другие классы, которые вы используете, также могут помещать элементы в очередь в ThreadPool. Следовательно, есть большая вероятность, что вы можете в конечном итоге нанести вред остальной части вашего приложения, сделав это. Также обратите внимание, что, поскольку ThreadPool использует алгоритм для оптимизации использования базовых ядер данной машины, ограничение числа потоков, которые пул потоков может поставить в очередь до произвольно малого числа, может привести к довольно катастрофическим проблемам с производительностью.

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

3
ответ дан 26 November 2019 в 22:48
поделиться

Я знаю, что это старый поток, но я просто хотел поделиться своим решением этой проблемы: использовать семафоры.

(Это в C #)

private void RunAllActions(IEnumerable<Action> actions, int maxConcurrency)
{
    using(SemaphoreSlim concurrencySemaphore = new SemaphoreSlim(maxConcurrency))
    {
        foreach(Action action in actions)
        {
            Task.Factory.StartNew(() =>
            {
                concurrencySemaphore.Wait();
                try
                {
                    action();
                }
                finally
                {
                    concurrencySemaphore.Release();
                }
            });
        }
    }
}
28
ответ дан 26 November 2019 в 22:48
поделиться
Другие вопросы по тегам:

Похожие вопросы: