Мне нужно оптимизировать службу 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, и это не помогает.