Я только собирался отредактировать этот ответ , но он кажется неправильным.Так что я выложу свой собственный ...
Согласно странице Threads для C # , на которой много учебных пособий по синхронизации, AutoResetEvent
использовать нельзядля межпроцессной синхронизации.
Однако для межпроцессной синхронизации можно использовать имя
EventWaitHandle
.На приведенной выше странице перейдите в раздел
Создание кросс-процесса EventWaitHandle .
Способ его настройки прост:
Процесс 1
EventWaitHandle handle = new EventWaitHandle(
false, /* Create handle in unsignaled state */
EventResetMode.ManualReset, /* Ignored. This instance doesn't reset. */
InterprocessProtocol.EventHandleName /* String defined in a shared assembly. */
);
ProcessStartInfo startInfo = new ProcessStartInfo("Process2.exe");
using (Process proc = Process.Start(startInfo))
{
//Wait for process 2 to initialize.
handle.WaitOne();
//TODO
}
Процесс 2
//Do some lengthy initialization work...
EventWaitHandle handle = new EventWaitHandle(
false, /* Parameter ignored since handle already exists.*/
EventResetMode.ManualReset, /* Explained below. */
InterprocessProtocol.EventHandleName /* String defined in a shared assembly. */
);
handle.Set(); //Release the thread waiting on the handle.
Теперь относительно EventResetMode
.Выбор типа EventResetMode.AutoReset
или EventResetMode.ManualReset
зависит от вашего приложения.
В моем случае мне потребовался ручной сброс, потому что у меня много процессов, подключенных к одному и тому же процессу.Итак, как только этот тот же процесс будет завершен при инициализации, все остальные процессы должны быть в состоянии выполнять работу.Таким образом, дескриптор должен оставаться в сигнальном состоянии (без сброса).
Для вас может быть полезен автоматический сброс, если вам нужно выполнять инициализацию каждый раз, когда процесс 1 запускается process 2 .
Примечание: InterprocessProtocol.EventHandleName
- это просто константа, заключенная в DLL, которая одновременно
process 1 и
процесс 2 ссылка.Вам не нужно этого делать, но это защитит вас от неправильного ввода имени и возникновения тупика.