Вопрос

У меня есть два несвязанных процесса, которые используют .СЕТЕВЫЕ сборки в качестве плагинов.Однако любой процесс может быть запущен / остановлен в любое время.Я не могу полагаться на то, что конкретный процесс является сервером.На самом деле, может быть запущено несколько копий одного из процессов, но только одного из других.

Изначально я внедрил решение, основанное на эта статья.Однако для этого требуется, чтобы тот, кто реализует сервер, был запущен раньше клиента.

Каков наилучший способ реализовать какое-либо уведомление для сервера, когда клиент (ы) запускался первым?

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

Решение

Использование общей памяти сложнее, потому что вам придется управлять размером буфера общей памяти (или просто предварительно выделить достаточно).Вам также придется вручную управлять структурами данных, которые вы туда помещаете.Однако после того, как вы протестируете его и заработаете, его будет легче использовать и тестировать из-за его простоты.

Если вы выберете маршрут удаленного взаимодействия, вы можете использовать IpcChannel вместо каналов TCP или HTTP для связи с одной системой с использованием именованных каналов. http://msdn.microsoft.com/en-us/library/4b3scst2.aspx.Проблема с этим решением заключается в том, что вам нужно будет придумать решение типа реестра (либо в общей памяти, либо в каком-либо другом постоянном хранилище), с помощью которого процессы могут регистрировать свои конечные точки.Таким образом, когда вы ищете их, вы можете найти способ запросить все конечные точки, которые запущены в системе, и вы сможете найти то, что ищете.Преимущества использования удаленного взаимодействия заключаются в том, что сериализация и вызов метода довольно просты.Кроме того, если вы решите перейти на несколько компьютеров в сети, вы можете просто переключить переключатель, чтобы вместо этого использовать сетевые каналы.Минусы заключаются в том, что удаленная связь может вызвать разочарование, если вы четко не отделите "Удаленные" вызовы от "Локальных".

Я не так уж много знаю о WCF, но, возможно, этим тоже стоит заняться.Spider sense говорит, что у него, вероятно, есть более элегантное решение этой проблемы...может быть.

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

Еще одна вещь, на которую следует обратить внимание в модели публикации-подписки для событий (Pub / Sub).Этот метод помогает, когда у вас есть прослушиватель, который запускается до того, как станет доступен источник события, но вы не хотите ждать регистрации на событие.Процесс "сервер" будет обрабатывать реестр событий, чтобы связать издателей и подписчиков.

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

Почему бы не разместить сервер и клиента с обеих сторон, и тот, кто подойдет первым, станет сервером?И если сервер выпадает из строя, клиент, который все еще активен, меняет роли.

Существует много способов обработки IPC (.net или нет), и через туннель TCP / HTTP является одним из способов ... но может быть очень плохим выбором (в зависимости от обстоятельств и окружающей среды).

Общая память и именованные каналы - это два способа (и да, они могут быть выполнены в .Net), которые могут быть лучшими решениями для вас.В .Net Framework также есть класс IPC ... но лично мне они не нравятся из-за некоторых проблем с AppDomain...

Я согласен с Гаро.

Использование сервиса pub / sub было бы отличным решением.Это, очевидно, означает, что эта служба должна быть запущена раньше любой из двух других.

Если вы хотите пропустить pub / sub, вы можете просто реализовать сервис в обоих приложениях с разными конечными точками.Когда любое из приложений запускается, оно пытается получить доступ к другому известному объекту через IPC-прокси.Если прокси-сервер выходит из строя, другой объект не запущен.

-Скотт

Я потратил 2 дня, просматривая все доступные опции IPC в поисках надежного, простого и быстрого способа выполнения полнодуплексного IPC. IP - библиотека, который я нашел на Codeplex.com, до сих пор отлично работает из всех вариантов, которые я пробовал.И все это всего с 7 строками кода.:D Если кто-нибудь наткнется на это, пытаясь найти полнодуплексный IPC, сэкономьте себе кучу времени и попробуйте эту библиотеку.Возьмите исходный код, скомпилируйте data.dll и следуйте приведенным примерам.

HTH, Окружность

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