Самый быстрый способ связи с Windows-сервисом - PullRequest
9 голосов
/ 17 февраля 2009

Мы работаем с сервисом, который требует быстрой связи с другим процессом. В настоящее время мы используем WCF NetNamedPipeBinding в буферизованном режиме для вызова методов в службе, которая, по-видимому, предлагает наименьшие издержки из доступных привязок WCF. Есть ли более быстрый способ сделать это с помощью управляемого кода?

Редактировать: Пакетные запросы, как предлагается ниже, уже рассмотрены. Действительно, нам интересно, существует ли альтернативный API для межпроцессных коммуникаций, который превосходит WCF с использованием именованных каналов.

Ответы [ 2 ]

8 голосов
/ 17 февраля 2009

Если вы используете WCF, то именованные каналы являются самым быстрым способом связи в локальной системе.

Если вы выбрасываете много данных, вы можете посмотреть потоковые API (просто добавив System.IO.Stream в качестве параметра вместо передачи массива или строки и т. Д.)

Также для производительности очень важна модель вашего хостинга с точки зрения режима вашего сервиса. Книга Ювала Лоуи о WCF на самом деле очень хороша, когда вы переходите от примеров кода к сути его книги.

РЕДАКТИРОВАТЬ: В ответ на ваш комментарий, посмотрите на атрибут "ServiceBehaviour", который вы можете применить к определению сервиса. (не ваше описание IServiceInterface, а ваша конкретная реализация вашего класса).

Вы можете определить свой код для экземпляра с помощью PerCall, PerSession или Singleton. По умолчанию singleton PerSession (спасибо @RichardOD) с режимом параллелизма, установленным на single, и instanceContextMode, установленным в true, что позволяет вам размещать WCF в форме окна и не позволяет вам стрелять в ноги, если вы не понимаю экземпляров.

В основном, если вы оставите значение по умолчанию, вы получите однопоточный, последовательно обработанный хост WCF.

MSDN имеет некоторую разумную информацию о том, что делает каждый тип.

3 голосов
/ 17 февраля 2009

Ну, вы ограничены по объему (то есть большие сообщения) или туда и обратно (много маленьких сообщений)?

Для больших сообщений рассмотрите сжатие (если сетевые операции ввода-вывода являются чрезмерными) или более эффективную сериализацию, например protobuf-net.

Для болтливых API рассмотрите возможность группирования сообщений, чтобы совершать меньше обращений.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...