在C#中进程间通信

4

我有一个服务,调用一个进程来创建一个文件(该进程是一个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));

感谢你的帮助,Bilel。

你能让服务定期检查文件是否存在吗? - Patrick
3
并行处理与进程间通信无关。协调文件访问也不是一种通信方法。 - Panagiotis Kanavos
我认为这对性能不利,我需要在文件创建后立即将其传输到我的服务中。 - Bilel Chaouadi
1
@BilelChaouadi,有很多IPC方法。父进程可以读取当前进程的输出流。您可以使用命名管道、TCP监听器、套接字、SOAP服务和命名互斥体。 - Panagiotis Kanavos
不,它不是一个Windows服务,只是一个类库项目。 - Bilel Chaouadi
显示剩余4条评论
3个回答

1

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

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

注意,这只适用于您确定该进程确实创建了文件的情况。否则,我建议循环使用sleep以确保文件已创建(使用File.Exists(path)),或读取进程输出以确保它创建了文件。阅读此文章以获取此选项。

使用 File.Exists(path) 检查文件是否存在肯定是足够的。 - Patrick
@Patrick 什么时候?多久一次?File.Exists需要在循环中运行,而WaitForExit()会在子进程完成后立即返回。 - Panagiotis Kanavos
@Patrick 如果创建文件是一个漫长的过程,就不要这样做。 - BWA
显然,在process.WaitForExit()之后执行File.Exists - Patrick
谢谢您的回答,但我认为使用循环和File.Exists不是一个好主意。我需要一些协议来在我的服务和进程之间进行通信。 - Bilel Chaouadi

1
正如已经提到的,使用WaitForExitHasExited - 可能还要调查进程ExitCode。您可以为ExitCode定义值,并以此方式发出文件是否已创建等信号。详情请参见this链接。
但是,如果您想在进程之间实际进行通信,请考虑使用匿名管道

最终我选择了使用 WaitForExit 和退出代码的解决方案。 - Bilel Chaouadi

0

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

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

另一个进程,即子进程,在完成某些预期的操作后,获取对现有事件的访问并将其设置为已发出信号的状态:

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

这是一个简化的流程,没有考虑到一些并发方面的问题,比如可能有多个进程可以创建/删除目标文件。如果这些事情很重要,那么处理方式与在单个进程内部本地应用的方式非常相似。在这种情况下,文件是一种共享状态,应该受到竞争条件的保护,您可以像使用命名事件一样使用命名互斥锁来实现。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接