Ответ 1
Можете ли вы перевести его на небольшой образец кода, который воспроизводит проблему? Какую версию EF вы используете?
Вот несколько замечаний, основанных на информации, которую вы указали до сих пор.
EF Async
Все, что меньше EF 6, всегда синхронно. С EF 6 вы можете использовать асинхронные методы вместо. Однако не делайте этого, если ваша служба WCF также не использует шаблон async.
WCF Async
Вы можете написать службу WCF, реализация которой асинхронна. Подробнее см. эту документацию.
Если вы используете один из вышеуказанных методов, но не оба, ваш код не будет асинхронным, но будет нести излишнюю нагрузку на синхронизацию. Особенно избегайте Task.Run()
или эквивалентов, так как они просто переместят работу в другой поток, фактически не улучшив пропускную способность.
Инициализация
Наконец, еще одна несвязанная идея. Может ли ваша проблема быть связана с инициализацией EF? Когда EF создает метаданные для модели, она делает это один раз для строки подключения. Если несколько потоков пытаются использовать одну и ту же модель и эта модель еще не была инициализирована, все потоки будут блокироваться до завершения инициализации. Чтобы убедиться, что это ваша проблема, сделайте один звонок в службу и позвольте ей выполнить. Затем отправьте 20 параллельных запросов. Неужели они все еще не работают с процессором?