C# 用C语言实现进程间的通信#

C# 用C语言实现进程间的通信#,c#,C#,我有一个调用进程来创建文件的服务(进程是winform),在我的服务中,我想在进程创建文件后读取该文件,我如何在我的服务和进程之间通信以检查文件是否正确创建 Process.Start(assemblyPath, xsdFileName + " " + fileName + " " + exportPDFFileName); //here I need to make sure that the file has been created correctly return new MemoryS

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

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

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

请注意,只有当您确定该进程确实创建了该文件时,这才有效。否则,我建议使用
sleep
循环以确保文件已创建(使用
file.Exists(path)
),或者读取进程输出以确保文件已创建。对于此选项。

如前所述,使用
WaitForExit
HasExited
-也许还可以调查流程
ExitCode
。您可以为
ExitCode
定义值,并以这种方式指示是否已创建文件等。有关详细信息,请参阅链接


但如果您想在进程之间进行一些通信,则考虑使用.

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

var fileCreationEvent = new EventWaitHandle(false, EventResetMode.ManualReset, "MyGloballyVisibleEvent");
...
fileCreationEvent.WaitOne();
// read your file
另一个进程(在您的例子中是子进程)获取对现有事件的访问权,并在完成某个预期操作后将其设置为信号状态:

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

这是一个简化的流程,它没有考虑一些并发性方面,例如有多个进程可以创建/删除目标文件的可能性。如果这些事情很重要,那么该方法与您在单个流程中本地应用的方法非常相似。在这种情况下,文件是一种共享状态,应该针对竞争条件进行保护,并且您可以使用命名的
互斥锁
,方法与命名事件相同。

您可以让服务定期检查文件是否存在吗?并行处理与进程间通信无关。协调文件访问也不是一种通信方法。我认为这对性能不好,一旦文件被创建,我需要一些东西传送给我的服务。对于进程间通信,你可以考虑,但这不是我所知道的跨平台。@ BilelChaouadi有很多IPC方法。父进程可以读取当前进程的输出流。可以使用命名管道。TCP侦听器。插座。SOAP服务。命名互斥体。使用
file.exists(path)
检查文件是否存在就足够了。@Patrick什么时候?多久一次
File.Exists
必须在循环中运行,而
WaitForExit()
将在子进程返回时立即返回finished@Patrick如果创建文件的过程很长,则为否。在
process.WaitForExit()之后执行
file.Exists
,显然…感谢您的回答,但我认为使用File.Exists和循环不是一个好主意。我需要一些协议来在我的服务和进程之间通信。最后,我选择了这个带有WaitForExit和退出代码的解决方案。