如何在一个单独的线程中打开一个窗口
本文关键字:一个 窗口 线程 单独 | 更新日期: 2023-09-27 17:49:31
我想做:
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<T>
自己完成此操作。只要记住使用Dispatcher或TaskScheduler从UI上下文创建的任何将更新UI,如进度通知。
你没有-只有一个GUI线程。如果你需要做阻塞工作,这些东西必须放到后台线程中
您需要使用Application类在新线程中运行一个单独的消息循环。
@SLaks如果你想在控制台应用程序中启动一个新窗口,这是非常有用的。一个选择是使用showDialog();
,但很难关闭它。
如果您使用Show()
,然后使用Application.run()
(这是使用Application类启动新消息循环的螺母和螺栓)
当你在主控制台线程中调用Application.Exit()
时,应用程序实际上关闭;
使用showDialog()
,你必须中止线程,然后等待,直到窗口得到某种输入,如鼠标在或焦点。