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

我想这样做:

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或焦点。 否则它将永远退出。