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

时间:2011-04-06 16:57:56

标签: c# wpf

我想这样做:

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");
}

但新窗口仍然冻结等 谁知道这里有什么问题?

4 个答案:

答案 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(),您必须中止线程,然后等待窗口获得某种输入,即鼠标悬停或焦点。否则它将永远退出。