C# 终止所有在主窗体关闭时以 Application.Run 启动的进程



我在与初始表单不同的线程中开始一堆不可见的形式

Thread thread = new Thread(() =>
{
var form= new myform();
try
{
System.Windows.Forms.Application.Run(form);
}
catch (Exception e2) { MessageBox.Show(e.ToString()); }
});
thread.ApartmentState = ApartmentState.STA;
thread.Start();

当我关闭 main 时,其他线程仍然存在,我必须使用

taskkill /f /im "myexe.exe"

从窗口运行。

如何从 C# 窗体中干净地关闭它们?

任何帮助表示赞赏。

您可以保留对您创建的每个后台线程的引用,然后在关闭主窗体时,只需中止所有子线程。可能不是最干净的解决方案,但它会起作用。更好的解决方案是向每个线程发送一条消息,并礼貌地要求他们停止正在执行的操作,然后等待您的主线程,直到所有子线程都完成。

保留后台线程列表

private List<Thread> myForms = new List<Thread>();

在创建背景表单的构造器中,将这些线程添加到此列表中

Thread thread = new Thread(() =>
{
var form = new Form1();
try
{
System.Windows.Forms.Application.Run(form);
}
catch (Exception e2)
{
MessageBox.Show(e2.ToString());
}
});
thread.SetApartmentState(ApartmentState.STA);
thread.Start();
myForms.Add(thread);
myForms.Add(thread2);
myForms.Add(thread3);

在这里,当我们关闭主窗体时,您可以杀死其他线程

private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
foreach (var t in this.threads)
{
try
{
t.Abort();
}
catch (ThreadAbortException)
{
// This will happen on each child thread
}
}
}

最新更新