【问题标题】:Process still runs after going out of scope - Is that safe?超出范围后进程仍然运行 - 这安全吗?
【发布时间】:2015-12-21 22:28:48
【问题描述】:

给定下面的代码,which was an accepted answer to another question.

以这种方式运行新进程是否安全,或者我应该管理对 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 将被垃圾收集。但是,进程本身仍将继续运行。
  • 一个进程永远不会“超出范围”——一旦你启动一个进程,它就会运行(作为一个单独的进程)直到它结束或有人强行终止它。 Process 实例可能超出范围,但这不是进程本身 - 它只是进程的描述符,可让您获取有关特定进程的信息。
  • 但是不会调用Dispose()方法结束进程吗?
  • @Don 不,Dispose 删除了与内存中 Process 实例相关联的资源,而不是该实例描述的进程
  • @Don 这样看:你的Process 实例独立于进程——你甚至在进程开始之前就创建了它。一旦启动,它就存在于一个单独的内存空间中。只要实例在范围内,Process 实例就能够获取有关进程的更新信息 - 之后它会被清理但不会影响进程。

标签: c# .net garbage-collection


【解决方案1】:

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

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

Process 实例可以被处置 - 这释放了查询操作系统进程所需的资源,但它实际上并没有结束相关进程 - 它只是停止使用 Process 实例访问不再是底层流程。

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

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

【讨论】:

    【解决方案2】:

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

    如果Process 对象死亡,那么操作系统进程可以继续。你只是不能通过现在已故的Process 对象与它进行交互。

    如果运行进程终止,那么Process对象仍然有意义。例如,您可以查询退出代码。

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

    【讨论】:

      猜你喜欢
      • 2018-11-03
      • 1970-01-01
      • 2014-11-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-29
      • 2016-12-12
      相关资源
      最近更新 更多