进程在超出范围后仍在运行-这样安全吗

本文关键字:安全 运行 范围 进程 | 更新日期: 2023-09-27 18:27:36

给出下面的代码,这是另一个问题的公认答案。

以这种方式运行新流程安全吗?还是我应该管理对MyProcess的引用?

据我所知,GC将(最终)处理不再具有引用的对象。随着MyProcess超出范围,当这个引用最终被垃圾回收时,Dispose()方法不会被调用吗?我的印象是,它可能会运行一段时间,直到GC进行收集。

void TestMethod()
{
    Process MyProcess = new Process();
    MyProcess.StartInfo = new ProcessStartInfo("app.exe");
    MyProcess.StartInfo.WorkingDirectory = "";
    MyProcess.StartInfo.Arguments = "some arguments";
    MyProcess.Start();
}

进程在超出范围后仍在运行-这样安全吗

一旦启动一个进程,它就永远不会超出范围-一个进程从操作系统中获得自己的内存空间和时间片,并一直运行,直到它决定退出或有人强行终止它。

Process实例是特定进程的描述符——它不是进程本身,但它能够获取有关进程的信息并对进程进行某些更改。

Process实例可以被丢弃-这释放了查询操作系统进程所需的资源,但实际上并没有结束有问题的进程-它只是阻止Process实例再被用来访问底层进程。

如果你想使用Process实例来实际停止底层进程,你可以调用Kill(),但这是危险的,不建议这样做——这实际上会立即停止进程,而不会让进程优雅地关闭(这可能会导致各种问题)。

回答您的问题:问题中的代码没有错——它只是启动一个操作系统进程,然后丢弃Process实例,而不将其用于其他任何事情。(可以使用Process实例重定向标准输入/输出,等待进程完成等)

Process对象独立于实际操作系统进程。任何一个都可以终止,而另一个可以继续。

如果Process对象死亡,则操作系统进程可以继续。您无法通过现在已经失效的Process对象与它进行交互。

如果操作过程终止,则Process对象仍然有意义。例如,您可以查询退出代码。

问题中的代码是完全安全的。