【问题标题】:Process.Kill() and process eventsProcess.Kill() 和处理事件
【发布时间】:2012-01-24 09:40:16
【问题描述】:

情况如下: 我必须创建一个程序,将另一个进程的输出流输入到文本框中。它本身不会造成太大的问题。然而,事实上我必须运行这个控制台应用程序的 5 个实例并将输出重定向到 5 个文本框,并且能够随时终止这些进程中的任何一个。据我所知,最好的方法是异步。但是这里的问题是杀死进程,这些进程是在不同的线程上创建的。我如何在无法访问它的情况下杀死它,因为它不存在于我必须杀死它的范围内。我最好的猜测是在Process.Start() 上获取它的PID,这样我就可以杀死它,所以......

是否可以通过Process.kill() 命令从进程中触发任何事件? 如果没有 - 有没有办法在与 Process.Kill() 大致相同的时间间隔内杀死一个确实触发某种事件的进程?

或者也许有人可以建议我一些其他方法或最佳实践来解决这些问题通常如何解决?

编辑:我在不同线程上运行所有进程的原因是我在其中一些线程上使用Thread.Sleep(),如果有输入参数告诉我必须在 x 秒后终止进程。

【问题讨论】:

  • 你说:“但这里的问题是杀死进程,这些进程是在不同的线程上创建的。”进程不是在不同的线程上创建的。一个过程就是一个过程。您是否混淆了进程和线程?
  • @PVitt 我认为他在谈论进程对象,所以最好的方法是存储一个静态列表,其中包含进程名称和进程 ID,您可以在其中获取进程 ID 并杀死它!
  • 但是进程名称和 ID 甚至可以在启动信息上分配吗?操作系统不是分配这些的吗?由于我只运行同一进程的 5 个实例,因此进程名称也是相同的。

标签: c# .net multithreading events process


【解决方案1】:

Process.Kill() 命令出于某种原因,实际上会触发进程退出事件。让我知道该进程已被终止的最简单方法是制作一个可变字符串,其中包含有关它如何结束的信息。 (在 process.kill 等之前将其更改为“killed”)

【讨论】:

    【解决方案2】:

    首先,您根本不需要线程。启动进程本身是异步的,因此 Process.Start(...) 不会阻塞,您可以创建任意数量的进程。

    您应该考虑创建 Process 类实例并将 CanRaiseEvents 属性设置为 true,而不是使用静态 Process.Start 方法。此外,您还可以注册几个事件(每个实例)——这些事件只会在 CanRaiseEvents 设置为 true 时引发,但也会在进程退出/退出后引发(包括 Kill() 调用)。

    【讨论】:

      【解决方案3】:

      当你打电话时

      Process.Start() 
      

      它返回一个 Process 类实例,您可以使用它从它的输出中检索信息并随时终止该进程

      Process p = Process.Start("process.exe");
      //some operations with process, may be in another thread
      p.Kill()
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2010-09-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多