【问题标题】:C# .net 3.5 inter process communication verify the child process has started okC# .net 3.5 进程间通信验证子进程是否启动正常
【发布时间】:2013-03-20 16:24:12
【问题描述】:

我的父进程将 process.start(..) 用于另一个进程。
子进程稍后将拥有我在其上调用 Initialized() 的 WCF 服务。
在调用任何方法之前,我想验证并确保该过程已正常启动。
现在我的代码是:

Process driverProcess = new Process();
driverProcess.StartInfo.FileName = ".."
driverProcess.Start();

然后我使用我的 WCF 服务客户端:

client.Initialize(..);

它正在工作,因为进程开始正常,但我没有任何迹象表明这一点。

例如,如果计算机不允许启动新进程,Process.Start() 将不起作用,我的客户端将尝试 .initialize() 一个不存在的 WCF 服务。

我可以使用什么技术来了解流程已经开始?命名管道客户端-服务器?

我不能使用 process.WaitForInputIdle(),因为这是我从中删除了 form1() 的 Winform 应用程序。 “无 GUI 窗口应用程序”。

【问题讨论】:

  • 无法连接到 WCF 服务是一个很好的提示。这是最好的一个,因为如果该过程开始正常但在尝试初始化服务时失败了,它也可以工作。除此之外,您通常可以在退出后依赖非零的 Process.ExitCode。
  • 嗨,汉斯,感谢您提醒我这个问题,我发布了答案。

标签: c# process


【解决方案1】:

我最后使用的是 EventWaitHandle。
我用它的进程 ID 命名父进程上的事件,当我创建子进程时,我将父进程 ID 作为 arg 发送。
当子进程完成初始化时,它会创建一个新的具有相同名称的 ManualResetEvent(父进程 id 来自 arg[0])并对其进行 .Set()。

父进程代码:

Process newProcess= new Process();  
newProcess.StartInfo.FileName = "YourProcessPath+FileName.exe" //use CombinePath  
newProcess.StartInfo.Arguments = string.Format("{0}", Process.GetCurrentProcess().Id);  
var handle = new EventWaitHandle(false, EventResetMode.AutoReset, Process.GetCurrentProcess().Id.ToString());
handle.Reset();
handle.WaitOne(); //wait until event is Set() from child Process

子进程中的代码:

signalParentProcessImReady = new EventWaitHandle(false, EventResetMode.AutoReset, args[0]);  
DoWwork()... initialize WCF Services for example...
signalParentProcessImReady .Set(); //Signal parent process Im ready

【讨论】:

  • 经过调查,上述工作是因为:“EventWaitHandle 类提供对命名系统同步事件的访问”,因此在同一台计算机上创建的同名的所有此类事件都可以设置/重置无论对象是从哪个进程创建的。
【解决方案2】:

您可以检查 Start() 方法的布尔值。此外,您可以将 Exited 事件处理程序与进程关联,以告诉您的应用程序该应用程序已完成。这样你也可以知道它是否开始和结束。

编辑:我忘了提到你也可以将你的起始代码放在一个 try 块中并检查 Start() 方法可能抛出的异常。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-08
    • 2010-09-18
    相关资源
    最近更新 更多