如何在WPF c#中关闭此线程上的窗口后终止线程?

时间:2013-04-04 17:44:49

标签: c# wpf multithreading

我是多线程新手。我正在使用wpf做一个项目。

我的项目简介:

  1. 一个主窗口
  2. 主窗口中的一个方法创建另一个创建另一个窗口的线程,称为窗口2。
  3. 每当窗口2可见时,主窗口被挂起(所以我使用join()方法暂停主线程)
  4. 问题是每当我关闭窗口2时,新线程都不会终止。所以主线程永远被暂停。那么如何解决这个问题呢。

    以下代码是我在MainWindow类中为窗口2创建新线程的地方:

    private void Button_Click_1(object sender, RoutedEventArgs e)
        {
            Thread addThread = new Thread(CreateCourseWindow);
            addThread.SetApartmentState(ApartmentState.STA);
            addThread.Start();
            Thread.Sleep(TimeSpan.FromSeconds(1));
            addThread.Join();
            if (addcourse.Saved) CreateCourseButton(myCourses.Count(), myCourses.Last());
        }
    

    以下代码是新线程的入口函数

    private void CreateCourseWindow()
        {
            addcourse = new AddCourse();
            addcourse.Activate();
            addcourse.Show();
            addcourse.Topmost = true;
            System.Windows.Threading.Dispatcher.Run();
        }
    

    以下代码是我要终止线程的地方

    private void Button_Click_2(object sender, RoutedEventArgs e)
        {
            this.Close();
        }
    

    AddCourse是2级窗口。

2 个答案:

答案 0 :(得分:0)

首先,不要创建多个UI线程。它创造了一个真正的混乱,非常很难处理。只有你的应用程序中的UI线程才有,除非你确定你需要更多,并且你真的知道你在做什么。

至于这种特定情况,您不必担心异步,多线程或其中任何一个:

ChildWindow child = new ChildWindow();
this.Hide();
child.ShowDialog();
this.Show();

使用ShowDialog代替Show,您可以删除所有令人讨厌的异步问题。

如果您希望父窗口可见但未启用,则可以删除显示/隐藏但保留ShowDialog,这将确保父窗口被禁用。

答案 1 :(得分:0)

  1. 建议不要悬挂线程暂停窗口。你得到的是一个完整的非响应窗口,它根本不处理任何Windows事件。例如,它不会响应移动事件,或设置游标事件,或者甚至是禁用窗口所期望的其他事情。此外,如果此线程上有任何COM STA对象,它们将挂起(即使您没有明确创建它们,有时也会有这样的对象)。

  2. 你是如何从第二个线程打开窗口的?听起来这个线程正在运行一个循环,当窗口关闭时它不会终止。如果您发布一些代码,它可以提供帮助。