.Net Core C# Execute method/class 作为子进程
.Net Core C# Execute method/class as a subprocess
出于内存隔离和稳定性的原因,我需要执行一些 methods/classes 作为子进程,而不是线程。
我发现以下库允许我这样做: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(...)
(here) and .Start(...)
(here) under the hood call the same private method .Start(...)
(source here)。这两个区别是:
- public
.Start(...)
方法 returns 私有 .Start(...)
方法返回的元组中的 process
对象,而 .Run(...)
不;
.Run(...)
方法还在参数中提供 waitForExit: true
。
私有.Start(...)
方法的代码中,有this portion:
if (waitForExit)
{
process.WaitForExit();
}
除此之外,这两个 public 方法是相同的。您的代码行为的差异很可能是由于没有等待子进程在您的父进程中完成。试试这个:
Process process = ExecFunction.Start(() => new NewSubProcessClass());
process.WaitForExit();
PS:请记住 Process
是 IDisposable
,所以最好是
using ( Process process = ExecFunction.Start(() => new NewSubProcessClass()) ) {
process.WaitForExit();
}
出于内存隔离和稳定性的原因,我需要执行一些 methods/classes 作为子进程,而不是线程。 我发现以下库允许我这样做: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(...)
(here) and .Start(...)
(here) under the hood call the same private method .Start(...)
(source here)。这两个区别是:
- public
.Start(...)
方法 returns 私有.Start(...)
方法返回的元组中的process
对象,而.Run(...)
不; .Run(...)
方法还在参数中提供waitForExit: true
。
私有.Start(...)
方法的代码中,有this portion:
if (waitForExit)
{
process.WaitForExit();
}
除此之外,这两个 public 方法是相同的。您的代码行为的差异很可能是由于没有等待子进程在您的父进程中完成。试试这个:
Process process = ExecFunction.Start(() => new NewSubProcessClass());
process.WaitForExit();
PS:请记住 Process
是 IDisposable
,所以最好是
using ( Process process = ExecFunction.Start(() => new NewSubProcessClass()) ) {
process.WaitForExit();
}