Дизайн внутрипроцессного взаимодействия с WCF (.NET) - PullRequest
6 голосов
/ 07 марта 2009

У меня интересная проблема с дизайном, и я надеялся, что вы все могли бы высказать некоторые предложения. Я использую C # и .NET 3.0

У меня есть очень хорошая расширяемая среда, построенная на основе WCF, которая автоматизирует настройку конечных точек и создание контрактов. Система, в которой я работаю, может работать по-разному - конечные точки могут находиться где-то еще в Интернете, работать в разных сборках на одном устройстве или даже работать в одном и том же процессе. WCF отлично подходит для того, чтобы сделать все это прозрачным, но в последнем случае я бы хотел повысить эффективность:

Я бы хотел избежать затрат на сериализацию объектов, которые никуда не денутся. Нет смысла делать это для связи между двумя потоками в одной сборке. В то же время я хотел бы использовать уже созданную инфраструктуру на основе WCF, поскольку ее будет намного проще поддерживать, если у нас нет двух отдельных каналов связи в зависимости от настройки системы.

Моей первой мыслью было использование указателей объектов в небезопасном контексте - не для борьбы с сериализацией, а только для сериализации минимального количества. Меня беспокоит это то, что в асинхронных сообщениях в средах, где сборщик мусора агрессивен, сообщение может и, вероятно, исчезнет, ​​прежде чем мы сможем разыменовать содержащийся в нем указатель, что приведет к множеству проблем.

Моей следующей мыслью было использование GCHandles, но я не уверен в их поведении - если GCHandle больше не ссылается, но содержит ссылку на управляемый объект, оба очищены GC или нет? Я беспокоюсь о том, чтобы с их помощью произошла огромная утечка памяти, потому что велика вероятность того, что сообщение будет потеряно, и мы не сможем вызвать Free (), а документация, которую я могу найти ... отсутствует .

Другая мысль состоит в том, чтобы использовать отражение для просмотра всех управляемых объектов, но кажется, что это потребует огромных затрат, и эта система должна быть максимально эффективной.

Итак, в общем, я пытаюсь отправить объект через процесс с WCF без его сериализации, что, насколько я могу судить, означает сохранение его живым, даже если на него временно нет ссылок. Кажется, это возможно, но мне интересно, пытаюсь ли я взять свой пирог и съесть его тоже.

Большое спасибо за ваш вклад!

Ответы [ 2 ]

9 голосов
/ 08 марта 2009

Проверьте нулевую транспортную привязку в этой статье.

http://www.codeproject.com/KB/WCF/NullTransportForWCF.aspx

6 голосов
/ 07 марта 2009

Я бы исследовал транспортный протокол "NetNamedPipes" в WCF, который специально разработан для межпроцессного взаимодействия на одном компьютере и имеет наименьшие возможные издержки (включая быструю двоичную сериализацию).

Марк

...