Запуск нескольких задач из службы WCF

Мне нужно оптимизировать службу WCF ... это довольно сложная вещь. Моя проблема на этот раз связана с задачами (параллельная библиотека задач, .NET 4.0). Происходит то, что я запускаю несколько задач при вызове службы (используя Task.Factory.StartNew ), а затем жду их завершения:

Task.WaitAll(task1, task2, task3, task4, task5, task6);

Хорошо ... что я вижу, а не например, это при первом звонке (иногда первые 2-3 звонка, если они делаются быстро один за другим), последняя задача запускается намного позже других (я рассматриваю случай, когда она запускалась на 0,5 секунды позже других). Я попытался позвонить

ThreadPool.SetMinThreads(12*Environment.ProcessorCount, 20);

в начале службы, но, похоже, это не помогло.

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

Есть идеи, почему последнее задание занимает так много времени? Что я могу с этим поделать?

В качестве альтернативы, следует ли использовать пул потоков напрямую? Так получилось, что в одном случае, на который я смотрю, одна задача уже завершилась до того, как началась последняя - я бы сэкономил 0,2 секунды, если бы повторно использовал этот поток вместо того, чтобы ждать создания нового. Однако я не могу быть уверен, что эта задача всегда будет заканчиваться так быстро, поэтому я не могу поместить оба запроса в одну задачу.

5 секунд после остальных). Я попытался позвонить

ThreadPool.SetMinThreads(12*Environment.ProcessorCount, 20);

в начале службы, но, похоже, это не помогло.

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

Есть идеи, почему последнее задание занимает так много времени? Что я могу с этим поделать?

В качестве альтернативы, следует ли использовать пул потоков напрямую? Так получилось, что в одном случае, который я рассматриваю, одна задача уже завершилась до того, как началась последняя - я бы сэкономил 0,2 секунды, если бы повторно использовал этот поток вместо того, чтобы ждать создания нового. Однако я не могу быть уверен, что эта задача всегда будет заканчиваться так быстро, поэтому я не могу поместить оба запроса в одну задачу.

5 секунд после остальных). Я попытался позвонить

ThreadPool.SetMinThreads(12*Environment.ProcessorCount, 20);

в начале службы, но, похоже, это не помогло.

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

Есть идеи, почему последнее задание занимает так много времени? Что я могу с этим сделать?

Как вариант, следует ли использовать пул потоков напрямую? Так получилось, что в одном случае, который я рассматриваю, одна задача уже завершилась до того, как началась последняя - я бы сэкономил 0,2 секунды, если бы повторно использовал этот поток вместо того, чтобы ждать создания нового. Однако я не могу быть уверен, что эта задача всегда будет заканчиваться так быстро, поэтому я не могу поместить оба запроса в одну задачу.

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

Есть идеи, почему последняя задача занимает так много времени? Что я могу с этим поделать?

В качестве альтернативы, следует ли использовать пул потоков напрямую? Так получилось, что в одном случае, на который я смотрю, одна задача уже завершилась до того, как началась последняя - я бы сэкономил 0,2 секунды, если бы повторно использовал этот поток вместо того, чтобы ждать создания нового. Однако я не могу быть уверен, что эта задача всегда будет заканчиваться так быстро, поэтому я не могу поместить оба запроса в одну задачу.

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

Есть идеи, почему последняя задача занимает так много времени? Что я могу с этим сделать?

Как вариант, следует ли использовать пул потоков напрямую? Так получилось, что в одном случае, на который я смотрю, одна задача уже завершилась до того, как началась последняя - я бы сэкономил 0,2 секунды, если бы повторно использовал этот поток вместо того, чтобы ждать создания нового. Однако я не могу быть уверен, что эта задача всегда будет заканчиваться так быстро, поэтому я не могу поместить оба запроса в одну задачу.

Есть идеи, почему последнее задание так долго? Что я могу с этим сделать?

Как вариант, следует ли использовать пул потоков напрямую? Так получилось, что в одном случае, который я рассматриваю, одна задача уже завершилась до того, как началась последняя - я бы сэкономил 0,2 секунды, если бы повторно использовал этот поток вместо того, чтобы ждать создания нового. Однако я не могу быть уверен, что эта задача всегда будет заканчиваться так быстро, поэтому я не могу поместить оба запроса в одну задачу.

Есть идеи, почему последнее задание так долго? Что я могу с этим поделать?

В качестве альтернативы, следует ли использовать пул потоков напрямую? Так получилось, что в одном случае, на который я смотрю, одна задача уже завершилась до того, как началась последняя - я бы сэкономил 0,2 секунды, если бы повторно использовал этот поток вместо того, чтобы ждать создания нового. Однако я не могу быть уверен, что эта задача всегда будет заканчиваться так быстро, поэтому я не могу поместить оба запроса в одну задачу.

[Edit] Операционная система - Windows Server 2003, поэтому ограничений на количество подключений быть не должно. Кроме того, он размещен в IIS - я не знаю, следует ли мне создавать обычные потоки или использовать пул потоков - какая версия предпочтительнее?

[Edit] Я также пробовал использовать Task.Factory.StartNew (action, TaskCreationOptions.LongRunning); - не помогает, последняя задача все равно запускается намного позже (примерно полсекунды) позже), чем остальные.

[Edit] MSDN 1 говорит:

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

Однако, как я уже сказал, я уже вызываю SetMinThreads, и это не помогает.

22
задан Marcel Popescu 18 January 2011 в 07:19
поделиться