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 的进程间通信

进程间通信:MFC 服务器、.NET C# 客户端

何时应该使用 Pipes 或 gRPC 进行进程间通信(在 C# .NET Core 中)?

c# 进程间的通信实现之一简单字符串收发

具有多个侦听器的简单进程间通信

Qt使用QProcess进程间双向通信(linux和win系统)