线程,进程和Application.Exit()

时间:2010-09-11 02:32:43

标签: c# .net multithreading process

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

在线程中,我使用var p = new Process();

调用了一些第三方应用程序

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

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

UPD

旧:

p.WaitForExit();

新:

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

6 个答案:

答案 0 :(得分:8)

只需尝试这个

创建线程时将其设为后台线程

Thread.IsBackground = true;

Application.Exit();

所有帖子都将关闭

答案 1 :(得分:3)

答案 2 :(得分:1)

独立于父进程创建进程。

最好的解决方案是为子进程创建一个信号,并在发出信号时让它们退出,然后正常关闭它们。

如果这些进程超出了您的控制范围,那么当您的父进程准备好退出时,您将不得不使用Process.CloseMainWindowProcess.Kill来终止这些进程。

答案 3 :(得分:1)

这是因为您的所有主题都是Foreground。并且Foreground线程(GUI)无法终止另一个Foreground线程。因此,您只需将新线程标记为Background,从而为新线程提供与Foreground线程(GUI)的依赖关系。 如果要将线程标记为Background线程,只需将其添加到代码中:

p.IsBackground = true;

答案 4 :(得分:0)

创建一个调用该进程的类,并在它的dispose上终止它。

答案 5 :(得分:-1)

使用Invoke()并在其中运行Application.Exit()命令:

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