如何在单独的线程中打开一个窗口?
我想这样做:
Window newWindow = new Window(); newWindow.Show(); while (true) { Console.Write("spin"); }
即,我正在主窗口中进行密集计算,但是这个新窗口(我试图用动画显示繁忙的指示器)没有响应(它被冻结)……
所以我试着这样做:
Thread thread = new Thread(() => { Window newWindow = new Window(); newWindow.Show(); }); thread.SetApartmentState(ApartmentState.STA); thread.Start(); while (true) { Console.Write("spin"); }
但新窗口仍然冻结等等。任何人都知道这里有什么问题吗?
你不应该尝试在它自己的线程中打开一个新窗口。
相反,将您正在进行的计算工作推送到后台线程,并保持UI线程免费。 最简单的选择通常是使用BackgroundWorker 。 它会自动处理进度和完成的封送回UI线程。
但是,您也可以使用线程或Task
/ Task
自己完成此操作。 只需记住使用Dispatcher或从UI上下文创建的TaskScheduler来处理将更新UI的任何内容,例如进度通知。
你没有 – 只有一个GUI线程。 如果你需要做阻塞工作,那些东西必须进入后台线程。
您需要使用Application类在新线程中运行单独的消息循环。
@SLaks如果您尝试从控制台应用程序启动新窗口,这可能非常有用。 一种选择是使用showDialog();
但后来很难关闭它。
如果使用Show()
然后使用Application.run()
(这是使用Application类启动新消息循环的细节)
当您在主控制台线程中调用Application.Exit()
时,应用程序实际关闭;
使用showDialog()
,您必须中止线程,然后等待窗口获得某种输入,即鼠标hover或焦点。 否则它将永远退出。