2009-03-06 3 views
6

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

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

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

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

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

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

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

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

ответ

6

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

Marc

9

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

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

+0

Хорошая идея, эта реализация не работает, хотя для меня, и я получаю '' System.NotImplementedException' в NullChannelFactory \ '1.OnBeginOpen (TimeSpan тайм-аут, AsyncCallback обратного вызова, состояние объекта)'. Поскольку этот проект не является открытым исходным кодом, не просто продлить и внести свой вклад. –

Смежные вопросы