Отправить сообщение из одного запущенного консольного приложения в другое - PullRequest
8 голосов
/ 26 января 2009

У меня есть одно консольное приложение, которое выполняет длительную синхронизацию с FTP-сервером.
Другое консольное приложение подготавливает локальную файловую систему с некоторыми необходимыми обновленными файлами.
Затем второй будет ждать окончания первого, прежде чем поменять окончательное имя каталога, чтобы оно стало видимым в Интернете.

Я искал лучший способ заставить приложение синхронизации сообщать второму приложению, что оно завершило свою работу. Похоже, Использование Data Copy для IPC является наиболее подходящим решением для этого.

Вопрос в два раза:

  • Я прав? Есть ли более прямой способ получить тот же результат?
  • Есть ли управляемый (.net) способ сделать это?

Ответы [ 2 ]

10 голосов
/ 26 января 2009

Если все, что вам нужно, это уведомить одно приложение о том, что другое выполнило свою задачу, самый простой способ - использовать именованный EventWaitHandle. Объект создан в своем неподписанном состоянии. Первое приложение ожидает дескриптор, а второе приложение сообщает дескриптору, когда оно завершает свою работу. Например:

// First application
EventWaitHandle waitForSignal = new EventWaitHandle(false, EventResetMode.ManualReset, "MyWaitHandle");

// Here, the first application does whatever initialization it can.
// Then it waits for the handle to be signaled:
// The program will block until somebody signals the handle.
waitForSignal.WaitOne();

Устанавливает первую программу, ожидающую синхронизации. Второе приложение одинаково просто:

// Second app
EventWaitHandle doneWithInit = new EventWaitHandle(false, EventResetMode.ManualReset, "MyWaitHandle");

// Here, the second application initializes what it needs to.
// When it's done, it signals the wait handle:
doneWithInit.Set();

Когда второе приложение вызывает Set, оно сигнализирует о событии, и первое приложение продолжит работу.

5 голосов
/ 26 января 2009

Другие популярные опции для IPC:

  • Именованные трубы
  • Remoting (.NET)
  • WCF

Если вам нужна только синхронизация, вы можете рассмотреть объект Semaphore или Mutex. Существуют классы, которые существуют в пространстве имен System.Threading для .NET. Если вы создаете их именованные версии, они применяются ко всей машине.

...