【问题标题】:C# kill all processes started with Application.Run when main form closes当主窗体关闭时,C# 杀死所有以 Application.Run 启动的进程
【发布时间】:2019-09-13 13:43:48
【问题描述】:

我正在从我的初始表单中以单独的线程开始一堆不可见的表单

 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 for 时,其他线程仍然存在,我必须使用

taskkill /f /im "myexe.exe"

从windows运行。

如何从我的 C# 表单中干净地关闭它们?

任何帮助表示赞赏。

【问题讨论】:

  • 嗯...您可以在 System.Diagnostics.Process 中运行该命令
  • 添加 thread.IsBackground = true; 使其成为自动的。
  • 谢谢,现在有没有办法在不退出主窗体的情况下杀死所有的孩子?
  • 杀死孩子会让你入狱。您必须很好地问,谷歌“c#取消线程”。您还必须查看this blog post,它显示了当在多个线程上使用表单被证明是一个坏主意时您必须做的事情。
  • 是的,我别无选择,我已经有数千行代码依赖于我将在不同线程中使用不同形式的假设

标签: c# winforms sta


【解决方案1】:

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

保留你的后台线程列表

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
        }
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-08-09
    • 2013-08-19
    • 1970-01-01
    • 2013-08-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多