2010-11-08 22 views
10

考虑以下情形:我跑我的应用程序,它,它的执行过程中,必须运行另一个进程,之后才是第二进程内完成特定的初始化,可我的第一个过程继续。例如:同步使用进程间的同步对象2点的过程 - 互斥或的AutoResetEvent

... 
// Process1 code does various initializations here 
Process.Start("Process2.exe"); 
// Wait until Process2 finishes its initialization and only then continue (Process2 doesn't exit) 
... 

我看到几个选项:

  1. 互斥 - 互斥想到会自动考虑进程间通信的时候,不过,我看不到导致处理1等待的方式他生成的互斥量。我可以使Process2创建一个互斥量并等待Process1直到创建互斥量(使用轮询和Mutex.OpenExisting函数)
  2. AutoResetEvent - 这些对于任务来说是完美的,但是,似乎在.NET下不能用于进程间通信。
  3. CreateEvent - 我可以使用P /调用和使用的Win32 CreateEvent功能。从理论上讲,它可以为我提供我需要的一切。如果可能,我宁愿不使用本机功能。
  4. 使用外部文件 - 最简单的方法是只使用一些OS外部对象(文件,注册表等)。然而,这看起来很不方便。

我很高兴听到你对这种情况下的意见。

谢谢!

回答

10

我正要编辑this answer,但它似乎并不正确。所以我会发布我自己的...

根据Threads for C#页面,其中有很多同步教程,AutoResetEvent不能用于进程间同步。


然而,一个名为 EventWaitHandle可用于进程间同步。 在上述页面中,请访问 Creating a Cross-Process 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.AutoResetEventResetMode.ManualReset取决于您的应用程序。

在我的情况下,我需要手动重置,因为我有很多进程连接到同一个进程。所以,一旦这个相同的进程完成初始化,所有其他进程应该能够工作。因此,手柄应处于信号状态(不重置)。

对你来说,如果你要为每一次执行初始化过程1点开始过程2自动复位可能会有所帮助。


边注:InterprocessProtocol.EventHandleName是刚刚结束了一个DLL,既 过程1过程2参考内部常数。您不需要这样做,但它可以保护您避免误输名称并导致死锁。

10

我会考虑** AutoResetEvent **。它们可以用于进程间通信,并且它们相对快速。 请访问以下链接:Threads for c#

阅读创建一个跨进程的EventWaitHandle节...

+3

AutoResetEvent只能是本地的。但你是对的 - EventWaitHandle正是我所期待的。谢谢! – VitalyB 2010-11-08 12:59:19

+0

为什么不能使用AutoResetEvent和ManualResetEvent进行进程间通信?它们都来自EventWaitHandle – caa 2015-12-30 10:40:17