Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/326.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在WPF c#中关闭线程上的窗口后终止线程?_C#_Wpf_Multithreading - Fatal编程技术网

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

如何在WPF c#中关闭线程上的窗口后终止线程?,c#,wpf,multithreading,C#,Wpf,Multithreading,我是多线程新手。我正在使用wpf做一个项目 我的项目简介: 一个主窗口 mainwindow中的一个方法创建另一个线程,该线程创建另一个窗口,称为窗口2 每当窗口2可见时,mainwindow就会挂起(因此我使用join()方法挂起主线程) 问题是每当我关闭窗口2时,新线程都不会终止。因此,主线程将永远挂起。那么如何解决这个问题呢 以下代码是我在MainWindow类中为窗口2创建新线程的代码: private void Button_Click_1(object sender, RoutedE

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

我的项目简介:

  • 一个主窗口
  • mainwindow中的一个方法创建另一个线程,该线程创建另一个窗口,称为窗口2
  • 每当窗口2可见时,mainwindow就会挂起(因此我使用
    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是Window2类。

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

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

    ChildWindow child = new ChildWindow();
    this.Hide();
    child.ShowDialog();
    this.Show();
    
    通过使用
    ShowDialog
    而不是
    Show
    可以消除所有讨厌的异步问题

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

  • 不建议通过挂线来挂起窗户。您得到的是一个完全没有响应的窗口,它根本不处理任何Windows事件。例如,它不会对移动事件、设置光标事件或其他您甚至希望禁用的窗口也会有的事情做出反应。此外,如果该线程上有任何COM STA对象,它们将挂起(有时甚至可能存在这样的对象,即使您没有显式创建它们)

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


  • 能给我们更多的信息吗?为什么要以这种方式使用线程?这是为了实现什么?因为每当我在前面有窗口2时,我想挂起主窗口(意味着用户无法与之交互)。我明白了,这很好,但正如您接受的答案所述,您不需要线程或类似的东西,您可以随时将窗口的
    ishitestvisible
    更改为False,这样用户就不能在其上单击任何内容。谢谢您的回答。如果我想同时显示主窗口和窗口2,并在窗口2处于活动状态时暂停主窗口,我该怎么办?@user1998777您应该按照我在上一句中提到的做,删除显示/隐藏调用。我不仅想禁用父窗口,我还希望父窗口等待来自子窗口的数据并执行一些操作。