创建新进程并传递对象

Posted

技术标签:

【中文标题】创建新进程并传递对象【英文标题】:Create new process and pass object 【发布时间】:2015-07-23 01:22:41 【问题描述】:

我有一个批处理应用程序,它处理大量输入以生成一些报告。它读取输入文本文件,生成报告定义列表,然后调用外部代码运行每个报告。

但是,外部报告生成代码包含某种内存泄漏。运行单个报告时没有问题,但运行多个报告时,机器将很快耗尽内存。我已经尝试清除报告实例并处理我可以处理的对象,但我发现清除内存的唯一方法是关闭进程。如果我将每个报告作为一个单独的进程运行,这可以解决问题。

所以我要求我的应用程序创建一个新进程,传递报表定义对象和服务器信息,并让该进程生成报表,然后关闭。然后重复下一个定义。我一直在研究使用 IPCChannel 的 .Net Remoting,但是我不知道如何简单地创建进程、传递信息(报告定义和服务器信息)并让它运行。

另一种选择是使用内存映射文件。或者可能使用控制台应用程序,但这需要序列化我的对象并传递大量文本和许多参数,这并不优雅。

那么,什么选项最适合创建进程、传递“报告定义”对象和服务器信息,然后允许进程在再次运行之前关闭?

【问题讨论】:

错过了你问题的最后一部分。我要做的不是做单独的进程,而是做单独的应用程序域。构建一个类库来完成您的报告工作并将其加载到控制台应用程序的应用程序域中。然后,您可以在应用程序域上来回传递接口。对于每个新报告,卸载应用程序域并重新加载应用程序域。 可选择将批处理文件重做为 powershell 脚本,并在每次运行脚本时打开一个新的 powershell 实例。使用父脚本在新的 powershell 实例中启动子脚本。可以将其配置为隐藏作为计划任务运行。 对不起,我不是很清楚。这是一个 .net 命令行应用程序,我可以用它启动其他命令行应用程序。但是我需要将一个不可序列化的对象从一个传递到另一个 - 这就是困难。我可以创建一个新的应用程序域(我现在正要尝试),但我认为传递不可序列化对象的问题仍然存在。 你为什么不在一个进程中做所有事情......然后让另一个进程重新启动它?甚至保留正在启动的过程中的定义。为什么它需要在进程 A 中。您可以使进程 A 只是一个重新启动器,并让目标进程退出并带有特定的返回码。如果 Return Code == 0,则成功完成,如果不再次运行。换句话说,您可以将退出代码用作循环指示器。当它为 0 时,它没有更多的事情要做,当它不是时,它准备重新启动并运行下一个。 如果您可以发布制作此“不可序列化对象”的代码,则更容易提出解决方案。我不明白用 C# 编写的东西怎么可能是不可序列化的。 【参考方案1】:

我建议您使用命名管道或匿名管道。这些专门用于进程间通信,而且速度非常快。在此处查看使用匿名管道的一个示例:https://msdn.microsoft.com/en-us/library/bb546102(v=vs.110).aspx

【讨论】:

以上是关于创建新进程并传递对象的主要内容,如果未能解决你的问题,请参考以下文章

1自动创建与启动的进程

1自动创建与启动的进程

通过在 Visual C++ 中传递函数来创建进程

main函数由哪个进程创建?

创建对象并将其传递给活动失败

Python Process创建进程的(2种方法)