进程在超出范围后仍在运行-这样安全吗
本文关键字:安全 运行 范围 进程 | 更新日期: 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
对象仍然有意义。例如,您可以查询退出代码。
问题中的代码是完全安全的。