我的应用程序包括主消息循环(GUI)和线程(Task.Factory)。
在线程中,我使用var p = new Process();
但是当我在消息循环中调用Application.Exit();
时 - 我可以看到在线程中启动的进程仍然在内存中并且正在执行。
所以问题是 - 如何在调用Application.Exit();
后立即杀死所有线程和进程?
UPD :
旧:
p.WaitForExit();
新:
while (!p.WaitForExit(1000))
{
if (FlagToExit)
{
p.Kill();
return;
}
}
答案 0 :(得分:8)
只需尝试这个
创建线程时将其设为后台线程
Thread.IsBackground = true;
和Application.Exit();
所有帖子都将关闭
答案 1 :(得分:3)
答案 2 :(得分:1)
独立于父进程创建进程。
最好的解决方案是为子进程创建一个信号,并在发出信号时让它们退出,然后正常关闭它们。
如果这些进程超出了您的控制范围,那么当您的父进程准备好退出时,您将不得不使用Process.CloseMainWindow
和Process.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();
});