我是多线程新手。我正在使用wpf做一个项目。
我的项目简介:
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级窗口。
答案 0 :(得分:0)
首先,不要创建多个UI线程。它创造了一个真正的混乱,非常很难处理。只有你的应用程序中的UI线程才有,除非你确定你需要更多,并且你真的知道你在做什么。
至于这种特定情况,您不必担心异步,多线程或其中任何一个:
ChildWindow child = new ChildWindow();
this.Hide();
child.ShowDialog();
this.Show();
使用ShowDialog
代替Show
,您可以删除所有令人讨厌的异步问题。
如果您希望父窗口可见但未启用,则可以删除显示/隐藏但保留ShowDialog
,这将确保父窗口被禁用。
答案 1 :(得分:0)
建议不要悬挂线程暂停窗口。你得到的是一个完整的非响应窗口,它根本不处理任何Windows事件。例如,它不会响应移动事件,或设置游标事件,或者甚至是禁用窗口所期望的其他事情。此外,如果此线程上有任何COM STA对象,它们将挂起(即使您没有明确创建它们,有时也会有这样的对象)。
你是如何从第二个线程打开窗口的?听起来这个线程正在运行一个循环,当窗口关闭时它不会终止。如果您发布一些代码,它可以提供帮助。