Проектирование взаимодействия в процессе с помощью WCF (.NET)

StackOverflow https://stackoverflow.com/questions/620683

Вопрос

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

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

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

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

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

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

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

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

Это было полезно?

Решение

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

Марк

Другие советы

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top