我想这样做:
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");
}
但新窗口仍然冻结等 谁知道这里有什么问题?
答案 0 :(得分:8)
你不应该尝试在它自己的线程中打开一个新窗口。
相反,将您正在进行的计算工作推送到后台线程,并保持UI线程空闲。最简单的选择通常是使用BackgroundWorker。它会自动处理进度和完成的封送回到UI线程。
但是,您也可以使用主题或Task
/ Task<T>
自行完成此操作。只需记住使用Dispatcher或从UI上下文创建的TaskScheduler来更新UI,例如进度通知。
答案 1 :(得分:2)
你没有 - 只有一个GUI线程。如果你需要做阻止工作,那些东西必须放在后台线程中。
答案 2 :(得分:2)
您需要使用Application类在新线程中运行单独的消息循环。
答案 3 :(得分:1)
@SLaks如果您尝试从控制台应用程序中启动新窗口,这将非常有用。一种选择是使用showDialog();
但是很难关闭它。
如果您使用Show()
然后使用Application.run()
(这是使用Application类启动新消息循环的细节)
当您在主控制台线程中调用Application.Exit()
时,应用程序实际关闭;
使用showDialog()
,您必须中止线程,然后等待窗口获得某种输入,即鼠标悬停或焦点。否则它将永远退出。