C # связь между процессами - PullRequest
7 голосов
/ 14 марта 2010

Я работаю с приложением и могу создавать сценарии C # для запуска в этой среде. Я могу импортировать библиотеки DLL любого вида в эту среду. Моя проблема в том, что я хотел бы включить связь между этими сценариями. Поскольку среда контролируется, и у меня нет доступа к исходному коду приложения, я не знаю, как это сделать.

Вещи, которые я пробовал:

  • Файловый ввод / вывод: просто пишу сообщения, которые я бы хотел, чтобы каждое читало в .txt файлах, а другой читал. Проблема в том, что мне нужно, чтобы эти скрипты запускались достаточно быстро, и это заняло слишком много времени.

  • nServiceBus : Я пробовал это, но я просто не мог заставить его работать в среде, с которой я имею дело. Я не говорю, что это невозможно сделать, просто Я не может этого сделать.

Кто-нибудь знает простой способ сделать это, это тоже довольно быстро?

Ответы [ 8 ]

4 голосов
/ 14 марта 2010

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

Например, если процесс A сообщает процессу B, скажем, отправить электронное письмо вашему ИТ-персоналу, в котором говорится, что сервер не работает, это очень важно.

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

Если первое, вам следует рассмотреть возможность использования постоянного хранилища, такого как база данных, для хранения сообщений, и позволить каждому процессу опрашивать базу данных для получения своих собственных сообщений. Таким образом, если процесс завершается или временно теряет связь с другими процессами, он сможет получить все пропущенные сообщения при повторном запуске.

3 голосов
/ 14 марта 2010

Ответ прост;

Поскольку вы можете импортировать любую DLL-библиотеку в сценарий, вы можете создать собственную DLL-библиотеку, которая будет осуществлять связь между процессами любым удобным для вас способом: общая память, именованный канал, TCP / UDP.

3 голосов
/ 14 марта 2010

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

Именованные каналы могут быть хорошим вариантом в этой ситуации. Они очень быстрые и довольно простые в использовании в .NET 3.5.

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

2 голосов
/ 14 марта 2010

Поскольку у вас уже есть файловый ввод / вывод, вы можете получить достаточную скорость, поместив его на RAM-диск. Если вы запрашиваете изменения сегодня, FileSystemWatcher может помочь вашему общению быстрее реагировать.

2 голосов
/ 14 марта 2010

Ну, не зная подробностей вашего окружения, я мало что могу предложить. Вы используете термин "сценарии C #" ... Я не совсем уверен, что это значит, поскольку C # обычно является скомпилированным языком.

Если вы используете обычный C #, изучали ли вы WCF с помощью Named Pipes? Если ваши сборки работают на одном физическом компьютере, вы сможете легко и быстро создать некоторые службы WCF, размещенные с привязкой именованного канала. Именованные каналы обеспечивают простой, эффективный и быстрый механизм передачи сообщений в локальном контексте. Сам WCF довольно прост в использовании и является нативным компонентом .NET Framework.

1 голос
/ 14 марта 2010

Другой простой способ - открыть сокет TCP на заранее определенном порту, подключиться к нему из другого процесса и обмениваться данными таким образом.

1 голос
/ 14 марта 2010

XMPP / Jabber - еще одно приложение, взгляните на jabber.net .

1 голос
/ 14 марта 2010

Вы можете использовать PipeStream . Которые быстрее, чем дисковые операции ввода-вывода, поскольку они выполняются с использованием основной памяти.

...