在C#中的进程之间进行通信

时间:2019-03-26 11:38:04

标签: c#

我有一个服务,该服务调用一个过程来创建文件(该过程是winform),在我的服务中,我想在该过程创建文件后读取该文件,如何在我的服务和该过程之间进行通信检查文件是否已正确创建。

Process.Start(assemblyPath, xsdFileName + " " + fileName + " " + exportPDFFileName);
//here I need to make sure that the file has been created correctly
return new MemoryStream(File.ReadAllBytes(exportPDFFileName));

感谢您的帮助, 胆汁

3 个答案:

答案 0 :(得分:1)

一个简单的解决方案是使用process.WaitForExit()来知道进程何时结束:

Process.Start(assemblyPath, xsdFileName + " " + fileName + " " + exportPDFFileName);
process.WaitForExit();
return new MemoryStream(File.ReadAllBytes(exportPDFFileName));

请注意,只有在您确定该过程确实创建了文件的情况下,此方法才有效。否则,建议使用sleep循环以确保已创建文件(使用File.Exists(path)),或读取进程输出以确保其创建了文件。 Read this post使用此选项。

答案 1 :(得分:1)

如前所述,使用WaitForExitHasExited-也许还要调查过程ExitCode。您可以为ExitCode定义值,并以此方式指示是否已创建文件等。有关详细信息,请参见this链接。

但是,如果您想在进程之间进行实际的通信,请考虑使用anonymous pipes

答案 2 :(得分:0)

如果您正在寻找描述“等待动作完成”语义的进程间通信协议,则可以使用命名事件和命名互斥体同步原语来实现该协议。使用这些原语的最简单机制是,在您的案例中,某个进程的父进程创建了一个命名的同步对象,并等待该对象的信号状态:

var fileCreationEvent = new EventWaitHandle(false, EventResetMode.ManualReset, "MyGloballyVisibleEvent");
...
fileCreationEvent.WaitOne();
// read your file

和另一个进程(在您的情况下为子进程)可以访问现有事件,并在完成某些预期操作后将其设置为信号状态:

var fileCreationEvent = EventWaitHandle.OpenExisting("MyGloballyVisibleEvent");
...
// create file here
fileCreationEvent.Set();

这是一个简化的流程,没有考虑到一些并发方面,例如可能存在多个可以创建/删除目标文件的进程。如果这些事情很重要,则该方法与您将在单个流程中本地应用的方法非常相似。在这种情况下,文件是一种共享状态,应防止出现竞争状况,并且您可以使用命名Mutex和命名事件相同的方式来使用该文件。