需要与子进程通信来处理文件

Posted

技术标签:

【中文标题】需要与子进程通信来处理文件【英文标题】:Need to communicate with child process to process a file 【发布时间】:2014-08-22 22:27:37 【问题描述】:

我有几个超级易碎的第 3 方 DLL。它们有时会挂起并且永远不会返回,或者有时会抛出奇怪的异常,从而影响整个过程。

我想移动这些 DLL,然后在单独的子进程中加载​​。这样一来,我就不必执行讨厌的 Thread.Abort 了,我可以干净利落地关闭该进程,然后在需要时重新生成它。

所以我的父应用程序接收到需要由某些第三方 DLL 处理的文件列表。我基本上需要将这些传递给新的子进程,让它处理文件,然后与父进程通信它是成功的。如果 sh*t 击中风扇并重新生成,我还必须能够降低该过程。这些文件以恒定流的形式出现,因此每次我获取文件时都生成一个进程是不可能的,我希望它一直存在并且只接受请求。

现在我正在从父进程生成子进程,然后尝试使用内存映射文件来共享文件/工作。仅传递所述文件的位置并在处理时以某种方式获得响应会更容易吗?

这里有什么好的策略...

【问题讨论】:

【参考方案1】:

我会……

创建一个 WCF 服务,使用托管 dll 并执行文件处理的 PerCall 实例 - 这将为每个调用生成一个新实例,如果任何调用发生故障,它不应该影响另一个。您甚至可以将它作为主应用程序的一部分托管,但也可以作为单独的 Windows 服务托管,并且由于它可能位于同一台机器上,因此请使用命名管道传输。

从您的主应用程序中触发每个请求。

如果您没有得到成功的响应(只要它不是 wcf 异常 - 即未找到端点),只需重试请求 x 次

【讨论】:

以上是关于需要与子进程通信来处理文件的主要内容,如果未能解决你的问题,请参考以下文章

与子进程通信的最快方式

使用重定向 I/O 与子进程通信时出现死锁

与子进程通信,无需等待子进程在 windows 上终止

使用 stdout/stderr 以外的管道与子进程通信

我可以以某种方式与子进程共享一个异步队列吗?

31互斥锁与进程间通信