Возникли проблемы в нагруженных WCF-сервисах — большое количество исключений по таймауту. После некоторых поисков выяснилось, что проблема в "длительных операциях", т.е. в сервисе есть несколько методов: некоторые выполняются относительно кратко, а некоторые долго. Долгие операции — это вызовы других WCF-сервисов и вызовы БД.
Получается, что throttling не решит данной проблемы, потому что короткие методы достаточно хорошо утилизируют ресурсы сервера, а долгие большую часть времени ждут.
В ASP.NET есть асинхронные операции, которые возвращают рабочий поток (Worker Thread) в общий пул, пока асинхронные операции выполняются. Хотелось бы в WCF-сервисе использовать нечто подобное — чтобы длительные операции на все wait'ы освобождали пул рабочих потоков WCF.
Сразу оговорюсь, что я в курсе про OperationContractAttribute.AsyncPattern, однако он не решает проблемы нескольких wait'ов в сервисе + не хочется менять вид контракта с синхронного на асинхронный (и тем самым ещё и клиентов переписывать).
P.S. Понятно, что можно разделить долгие/короткие операции в разные сервисы и с помощью throttling регулировать загрузку (для котортких меньше, для долгих больше), но на мой взгляд это не очень "красиво".