Duplex Wcf Server Threading - Где выполнять синхронный ввод / вывод БД?
-
05-07-2019 - |
Вопрос
Вот мои основные предположения:
<Ол>Wcf выполняет мои методы работы службы в потоках IOCP (UnsafeQueueNativeOverlapped) вместо обычных потоков ThreadPool (QueueUserWorkItem).
Блокировка ввода-вывода не должна выполняться внутри односторонних методов работы службы.
Блокировка ввода-вывода не должна выполняться внутри обычной темы ThreadPool.
Я считаю, что лучшей стратегией является цепочка асинхронных вызовов . Итак, если я получаю сообщение в свою одностороннюю операцию обслуживания, я делаю асинхронный вызов моей БД, а когда он завершается, делаю следующий асинхронный вызов БД и т. Д. И, наконец, отвечаю через мой обратный вызов wcf ... р>
Однако каждый асинхронный вызов базы данных сложно выполнить. Я прибег к нарушению правил 2 и 3 выше, но мне это не нравится, потому что я считаю, что в конечном итоге это приведет к истощению потока ThreadPool. Есть ли лучшие стратегии?
Я рассмотрел использование CustomThreadPool Джона Скита, но я тоже не уверен, что это ответ.
Решение
Я бы предложил нарушить правило 3, поставив в очередь синхронные вызовы ввода-вывода для выполнения ThreadPool. Методы обслуживания по-прежнему возвращаются немедленно, но в конечном итоге работа выполняется в фоновом режиме, возможно, с помощью уведомления о возврате.