-1

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

我的项目简介:

  1. 一个主窗口
  2. mainwindow 中的一个方法创建另一个线程,该线程创建另一个窗口,称为窗口 2。
  3. 每当窗口 2 可见时,主窗口就会被挂起(所以我使用join()了挂起主线程的方法)

问题是每当我关闭窗口 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 类。

4

2 回答 2

0

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

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

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

通过使用ShowDialog而不是Show你删除所有讨厌的异步问题。

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

于 2013-04-04T17:47:29.500 回答
0
  1. 不建议通过挂起线程来挂起窗口。你得到的是一个完全无响应的窗口,它根本不处理任何 Windows 事件。例如,它不会对移动事件、设置光标事件或其他您认为即使是禁用的窗口也会有的事情做出反应。此外,如果此线程上有任何 COM STA 对象,它们将挂起(有时即使您没有明确创建它们,也可能存在此类对象)。

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

于 2013-04-04T17:49:15.147 回答