作用域结束后进程仍在运行 - 是否安全?

3
给定下面的代码,这是对另一个问题的接受答案。 用这种方式运行新进程安全吗?还是我应该管理对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();
}

我假设通过 MyProcess 引用的进程将被垃圾回收。然而,进程本身仍将继续运行。 - Joseph Young
1
一个进程永远不会“超出范围”——一旦启动了一个进程,它就会一直运行(作为单独的进程),直到结束或被强制终止。一个Process实例可能超出范围,但那不是进程本身——它只是进程的描述符,让您获取有关特定进程的信息。 - xxbbcc
@Don 不,Dispose 会处理与内存中的 Process 实例相关联的资源,而不是该实例所描述的进程本身。 - xxbbcc
1
@Don,从这个角度来看:您的Process实例独立于进程存在 - 在进程启动之前就创建了它。一旦它启动,它就存在于一个单独的内存空间中。只要实例在作用域内,它就有能力获取有关进程的更新信息 - 之后它会被清理,但这不会影响进程。 - xxbbcc
在调用Start()之后立即放置MyProcess.Dispose()是否安全? - Moon
显示剩余2条评论
2个回答

3
一旦您启动一个进程,它就永远不会超出范围 - 进程获得自己的内存空间和来自操作系统的时间片,并且在它决定退出或有人强制终止它之前运行。 Process实例是特定进程的描述符 - 它不是进程本身,但具有获取有关进程信息并对进程进行某些更改的能力。 < p > Process 实例可以被处理 - 这将释放查询操作系统进程所需的资源,但它实际上并没有结束该进程 - 它只是停止了使用 Process 实例来访问底层进程。

如果您想使用 Process 实例来实际停止底层进程,则可以调用 Kill(),但这是危险的且不推荐使用 - 这会立即停止进程,而不允许进程正常关闭(这可能导致各种问题)。

回答您的问题:您提出的代码没有问题 - 它只是启动了一个操作系统进程,然后丢弃了 Process 实例而没有再次使用它。(可以使用 Process 实例重定向标准输入/输出,等待进程完成等)


2
Process对象与实际的操作系统进程无关,两者可以分别终止。如果Process对象终止,则操作系统进程可以继续运行,只是无法通过已经终止的Process对象进行交互。如果操作系统进程终止,则Process对象仍然有意义,例如,您可以查询退出代码。问题中的代码是完全安全的。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接