繁体   English   中英

线程,进程和Application.Exit()

[英]Threads, processes and Application.Exit()

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

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

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

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

UPD

旧:

p.WaitForExit();

新:

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

试试吧

当你创建一个线程使它成为后台线程

Thread.IsBackground = true;

并在Application.Exit();

所有线程都将被关闭

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

p.IsBackground = true;

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

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

如果进程超出了您的控制范围,那么当您的父进程准备退出时,您将不得不使用Process.CloseMainWindowProcess.KillProcess.Kill它们。

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM