【问题标题】:Threads, processes and Application.Exit()线程、进程和 Application.Exit()
【发布时间】:2010-09-11 02:32:42
【问题描述】:

我的应用程序由主消息循环 (GUI) 和线程 (Task.Factory) 组成。

在线程中,我使用var p = new Process(); 调用一些第 3 方应用程序

但是当我在消息循环中调用 Application.Exit(); 时 - 我可以看到在线程中启动的进程仍在内存中并且正在执行。

所以问题是 - 如何在 Application.Exit(); 被调用后立即终止所有线程和进程?

UPD

旧:

p.WaitForExit();

新:

while (!p.WaitForExit(1000))
{
    if (FlagToExit)
    {
        p.Kill();
        return;
    }
}

【问题讨论】:

    标签: c# .net multithreading process


    【解决方案1】:

    试试这个

    当你创建一个线程时,让它成为后台线程

    Thread.IsBackground = true;
    

    Application.Exit();

    所有线程都将关闭

    【讨论】:

    • -1:这不会终止子进程,这是操作问题的一半。
    【解决方案2】:

    处理Application.ApplicationExit 事件。

    【讨论】:

    • 所以我只需要创建一些我需要在线程中观察的布尔标志,当它变为真时(我将在Application.ApplicationExit 事件上将其分配为真) - 然后终止进程?
    • 我添加了更新,关于我希望如何实现它。请批评它。
    【解决方案3】:

    进程是独立于父进程创建的。

    最好的解决方案是为子进程创建一个信号,并在收到信号时让它们退出,优雅地关闭它们。

    如果进程不在您的控制范围内,那么当您的父进程准备退出时,您必须使用 Process.CloseMainWindowProcess.Kill 杀死它们。

    【讨论】:

    • 会的。我使用传统名称Terminate 进行了搜索,所以我错过了Kill 方法。答案已更新。
    【解决方案4】:

    发生这种情况是因为您的所有线程都是Foreground。并且Foreground 线程(GUI)不能终止另一个Foreground 线程。所以你只需要将你的新线程标记为Background,然后让新线程依赖于你的Foreground 线程(GUI)。 如果您想将线程标记为Background 线程,您只需将其添加到您的代码中:

    p.IsBackground = true;
    

    【讨论】:

    • 这样,你就不再需要使用 Application.ApplicationExit 了。
    【解决方案5】:

    创建一个调用该进程的类并在它被处置时终止它。

    【讨论】:

      【解决方案6】:

      使用 Invoke() 并在内部运行 Application.Exit() 命令,如下所示:

      this.Invoke((Action)delegate ()
      {
          Application.Exit();
      });
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-09-15
        • 2010-09-25
        • 2011-01-21
        • 1970-01-01
        • 2017-02-02
        • 1970-01-01
        相关资源
        最近更新 更多