首页 > 解决方案 > .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();

是解决问题的方法。

标签: c#linuxdocker.net-coreprocess

解决方案


如果您检查 的源代码,引擎盖下的Tmds.ExecFunction两个方法.Run(...)这里)和.Start(...)这里.Start(...))调用相同的私有方法(这里的源代码)。这两个区别是:

  1. 公共.Start(...)方法process从私有方法返回的元组中返回对象,.Start(...).Run(...)没有;
  2. .Run(...)方法还提供waitForExit: true了参数。

在私有.Start(...)方法的代码中,有这部分

if (waitForExit)
{
    process.WaitForExit();
}

除此之外,这两种公共方法是相同的。您的代码行为的差异很可能是由于没有等待子进程在您的父进程中完成。尝试这个:

Process process = ExecFunction.Start(() => new NewSubProcessClass());
process.WaitForExit();

PS:记住那ProcessIDisposable,所以可能会更好

using ( Process process = ExecFunction.Start(() => new NewSubProcessClass()) ) {
    process.WaitForExit();
}

推荐阅读