C# .net 3.5 进程间通信验证子进程是不是启动正常
Posted
技术标签:
【中文标题】C# .net 3.5 进程间通信验证子进程是不是启动正常【英文标题】: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。 嗨,汉斯,感谢您提醒我这个问题,我发布了答案。 【参考方案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() 方法可能抛出的异常。
【讨论】:
以上是关于C# .net 3.5 进程间通信验证子进程是不是启动正常的主要内容,如果未能解决你的问题,请参考以下文章
C# (.NET 2.0) 中 Windows 的进程间通信