Мне нужно оптимизировать службу WCF... это довольно сложная вещь. Моя проблема на этот раз связана с задачами (Task Parallel Library,.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 секунды, если бы повторно использовал этот поток вместо того, чтобы ждать создания нового. Однако я не могу быть уверен, что эта задача всегда будет заканчиваться так быстро, поэтому я не могу поставить оба запроса в одну и ту же задачу.
[Изменить] ОС - это Windows Server 2003, поэтому не должно быть ограничений на соединение. Кроме того, он размещен в IIS - я не знаю, должен ли я создавать обычные потоки или использовать пул потоков - что является предпочтительной версией?
[Edit] Я также попытался использовать Task.Factory.StartNew(action, TaskCreationOptions.LongRunning);
- это не помогает, последняя задача по-прежнему начинается намного позже (примерно через полсекунды), чем остальные.
[Изменить] MSDN 1 говорит:
Пул потоков имеет встроенную задержку (полсекунды в .NET Framework версия 2.0) перед запуском нового простоя потоки. Если ваша заявка периодически запускает множество задач в короткое время, небольшое увеличение количество простаивающих потоков может значительное увеличение пропускной способности. Установка количества простоя высокая потребляет системные ресурсы без необходимости.
Однако, как я уже сказал, я уже звоню в SetMinThreads, и это не помогает.