如何在一个单独的线程中打开一个窗口

本文关键字:一个 窗口 线程 单独 | 更新日期: 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(),你必须中止线程,然后等待,直到窗口得到某种输入,如鼠标在或焦点。