[英]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.CloseMainWindow
和Process.Kill
来Process.Kill
它们。
创建一个调用该进程的类,并在它的dispose上终止它。
使用Invoke()并在里面运行Application.Exit()命令,如下所示:
this.Invoke((Action)delegate ()
{
Application.Exit();
});
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.