c# - .Net Core C# 将方法/类作为子进程执行
问题描述
出于内存隔离和稳定性的原因,我需要将一些方法/类作为子进程执行,而不是线程。我找到了允许我这样做的以下库:https ://github.com/tmds/Tmds.ExecFunction 。
但是,我似乎无法找到获取子进程的进程 ID 的方法。
ExecFunction.Run(() => new NewSubProcessClass());
上面的代码将生成一个新进程,甚至会在 Linux Docker 容器中生成控制台输出。问题是,我没有进程 ID。
public static Process Start(Action action, Action<ExecFunctionOptions> configure = null);
我上面引用的方法看起来应该可以解决问题,但是,当我替换
ExecFunction.Run(() => new NewSubProcessClass());
和
Process process = ExecFunction.Start(() => new NewSubProcessClass());
我不再得到任何控制台输出。
更新0:
来自@bazzilic 的建议
process.WaitForExit();
是解决问题的方法。
解决方案
如果您检查 的源代码,引擎盖下的Tmds.ExecFunction
两个方法.Run(...)
(这里)和.Start(...)
(这里.Start(...)
)调用相同的私有方法(这里的源代码)。这两个区别是:
- 公共
.Start(...)
方法process
从私有方法返回的元组中返回对象,.Start(...)
而.Run(...)
没有; - 该
.Run(...)
方法还提供waitForExit: true
了参数。
在私有.Start(...)
方法的代码中,有这部分:
if (waitForExit)
{
process.WaitForExit();
}
除此之外,这两种公共方法是相同的。您的代码行为的差异很可能是由于没有等待子进程在您的父进程中完成。尝试这个:
Process process = ExecFunction.Start(() => new NewSubProcessClass());
process.WaitForExit();
PS:记住那Process
是IDisposable
,所以可能会更好
using ( Process process = ExecFunction.Start(() => new NewSubProcessClass()) ) {
process.WaitForExit();
}
推荐阅读
- r - 传单地图不提取反应数据
- visual-studio - 如何从面向 WSL 的 Visual Studio 2019 运行 Qt 应用程序
- css - Max Mega Menu 子菜单顶部的白色三角形
- matlab - 多个工人,每个工人都有多个核心
- html - 如何使按钮彼此靠近?
- python - 将整数格式规范“d”逐行应用于 pandas DataFrame 中的 numpy.int 列时会产生 ValueError
- asp.net-core - 无法加载文件或程序集'Microsoft.EntityFrameworkCore.SqlServer,版本 = 3.1.0.0
- machine-learning - 使用 huggingface 的 distilbert 模型生成文本
- android - Android - 无法在数据绑定中设置变量(通过 ViewDataBinding),该怎么办?
- javascript - 无法使用添加商品将商品添加到购物车