Максимальная пропускная способность
Решение, вероятно, заключается в том, чтобы вообще не мыслить в терминах WCF. Возможно, вам нужен конечный автомат, работающий в отдельном потоке от ServiceHost. Этот конечный автомат будет содержать, например, обтекание, очередь или аналогичный класс. Конечному автомату будет предоставлен делегат, который будет использоваться для обработки сообщений. Когда ваш WCF ServiceHost получает сообщения, он помещает сообщения в очередь, инкапсулированную в вашем автомате состояний, и это все, о чем он будет заботиться.
Поскольку конечный автомат выполняет итерацию с указанным интервалом, он будет извлекать сообщения из очереди в любом количестве, которое вы пожелаете. В идеале, вы должны сделать так, чтобы это регулировалось настройками конфигурации вашего сервиса. Это позволит вам поэкспериментировать с тем, какие размеры пакетов работают лучше всего, подобно тому, как может быть полезно собирать вместе обновления строк в таблицах базы данных для повышения производительности.
Пакетные сообщения
Конечно, вы могли бы спроектировать свой конверт обмена сообщениями (в основном, тип, который вы передаете в качестве параметра методу OperationContract), чтобы он был в основном контейнером от 1 до N сообщений. Это определенно оптимизирует доставку байтов путем минимизации количества сообщений. Однако, если одно сообщение прибудет или N сообщений прибудут одновременно, это не изменит логику, необходимую для правильной обработки этих сообщений, за исключением добавления некоторого цикла для перебора N сообщений. Тот факт, что вы готовы рассмотреть MSMQ, предполагает, что ваша парадигма обмена сообщениями уже асинхронна, и поэтому она должна хорошо работать с подходом, который я описываю для максимизации пропускной способности.