鉴于以下代码,which was an accepted answer to another question.
以这种方式运行新进程是否安全,还是应该管理对MyProcess的引用?
根据我的理解,GC将(最终)处理不再具有参考的对象。如果MyProcess超出范围,当此引用最终被Garbage Collected时,是否不会调用Dispose()方法? 我的印象是它可能会运行一段时间,直到GC进行收集。
void TestMethod()
{
Process MyProcess = new Process();
MyProcess.StartInfo = new ProcessStartInfo("app.exe");
MyProcess.StartInfo.WorkingDirectory = "";
MyProcess.StartInfo.Arguments = "some arguments";
MyProcess.Start();
}
答案 0 :(得分:3)
一旦启动进程,它就永远不会超出范围 - 进程从操作系统获取自己的内存空间和自己的时间片,直到它决定退出或有人强行终止它为止。
Process
实例是特定进程的描述符 - 它不是进程本身,但它能够获取有关进程的信息并对进程进行某些更改。
可以处理Process
实例 - 这会释放查询操作系统进程所需的资源,但它实际上并没有结束有问题的进程 - 只是阻止了Process
实例用于访问基础流程。
如果你想使用Process
实例来实际停止基础流程,你可以调用Kill()
但这很危险而且不推荐 - 这实际上会立即停止流程,而不会让流程优雅地关闭(这会导致各种问题)。
回答你的问题:你的问题中的代码没有任何问题 - 它只是启动一个操作系统进程,然后抛弃Process
实例,而不使用它来做任何其他事情。 (可以使用Process
实例重定向标准输入/输出,等待进程完成等。)
答案 1 :(得分:2)
Process
对象独立于实际的操作系统进程。任何一方都可以在另一方生存时终止。
如果Process
对象死亡,则操作系统进程可以继续。你只是无法通过现在已故的Process
对象与它进行交互。
如果操作过程终止,则Process
对象仍然有意义。例如,您可以查询退出代码。
问题中的代码非常安全。