【问题标题】:How to close child forms running in their own threads when parent form closes? (non MDI)父窗体关闭时如何关闭在自己的线程中运行的子窗体? (非 MDI)
【发布时间】:2016-09-29 12:39:41
【问题描述】:

我有一个应用程序,其中使用单个子表单定义从父表单生成多个子表单(即 frmParent 生成 frmChild 的多个实例)。

每个孩子都在自己的线程中运行 - 我希望能够独立地与每个孩子互动(而且我不喜欢 MDI)。

那么 - 如果父窗体已关闭,我如何指示子窗体自行关闭?

        private void btn1_Click(object sender, EventArgs e)
    {
        Thread thread = new Thread(delegate ()
        {
            using (Child child = new Child())
            {
                child.MyName = "1";
                child.ShowDialog();
            }
        });
        thread.SetApartmentState(ApartmentState.STA);
        thread.Start();
    }

    private void btn2_Click(object sender, EventArgs e)
    {
        Thread thread = new Thread(delegate ()
        {
            using (Child child = new Child())
            {
                child.MyName = "2";
                child.ShowDialog();
            }
        });
        thread.SetApartmentState(ApartmentState.STA);
        thread.Start();
    }

【问题讨论】:

  • 所有 UI 组件都应该只在一个线程上运行:主 (UI) 线程。这是规则。
  • 您确定他们在自己的线程中吗?通常只有一个 UI 线程。你是怎么给他们看的?
  • 只需使用child.Show()。你不需要/不应该使用另一个线程。
  • 在上面的点击事件处理程序中不使用另一个线程,只需写:new Child().Show();
  • 最好还是编辑一下答案,然后根据 cmets 下结论,比如 作为基于 cmets 的结论,所有 UI 组件都应该只运行在一个线程上:主(UI)线程.这就是规则。您不需要/不应该使用另一个线程。因此,无需在单击事件处理程序中使用其他线程,只需编写:new Child().Show();。这是一个更完整和有用的答案。你会得到我的投票。

标签: c# multithreading winforms parent-child


【解决方案1】:

作为基于 cmets 的结论,所有 UI 组件都应该只在一个线程上运行:主 (UI) 线程。这就是规则。您不需要/不应该使用另一个线程。因此,无需在单击事件处理程序中使用另一个线程,只需编写:new Child().Show();

【讨论】:

  • 不要写new Child().Show(),因为Child 是一次性的。这种方式是内存泄漏。
  • 那么解决方案是什么?
  • @Enigmativity 这不会泄漏。该表单将被添加到 Application.OpenForms 集合中,并在用户关闭主表单时由用户或程序处理。
  • @Enigmativity 当您使用Show 方法显示表单时,您不需要(也不能)调用 Dispose。表单将在关闭后自行处理。
猜你喜欢
  • 2011-08-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多