C# 是否可以在另一个线程中加载新的wpf窗口以避免冻结当前窗口?

C# 是否可以在另一个线程中加载新的wpf窗口以避免冻结当前窗口?,c#,wpf,multithreading,C#,Wpf,Multithreading,所以我有一个小问题。。。当从一个窗口(启动窗口)启动第二个窗口(主窗口)时,第二个窗口非常沉重,需要大约10秒的加载时间,这意味着启动窗口将冻结10秒,然后启动第二个窗口并自动关闭 因此运行此函数需要10秒:BoardTable=newboardtable() 我想有一些实时加载的符号/图形,而它的加载10秒,而不是冻结整个用户界面 *我已尝试在另一个线程结果=>静态线程错误上加载第二个窗口 *加载了静态线程(从stackoverflow的另一篇文章中得到这个想法)。。。UI将冻结,或者第二个表

所以我有一个小问题。。。当从一个窗口(启动窗口)启动第二个窗口(主窗口)时,第二个窗口非常沉重,需要大约10秒的加载时间,这意味着启动窗口将冻结10秒,然后启动第二个窗口并自动关闭

因此运行此函数需要10秒:
BoardTable=newboardtable()
我想有一些实时加载的符号/图形,而它的加载10秒,而不是冻结整个用户界面

*我已尝试在另一个线程结果=>静态线程错误上加载第二个窗口

*加载了静态线程(从stackoverflow的另一篇文章中得到这个想法)。。。UI将冻结,或者第二个表根本不会加载


因此,当UI一直冻结时,我对如何实现某种加载符号感到有点困惑:(

我实际上尝试了一种工作方法,在这里分享它,以防其他人将来遇到同样的问题:

StartWindow:

        Thread t = new Thread(new ParameterizedThreadStart(LoadSecondWindow));
    t.SetApartmentState(ApartmentState.STA);
    t.Start(gameMode);
在新线程上:

        private void LoadSecondWindow(object o)
    {
        GameMode gameMode = (GameMode)o;
        Table blackjackTable = new Table(gameMode);
        blackjackTable.Show();
        Dispatcher.Run();
    }

Dispatcher.Run()实际上解决了这一切…现在我们可以在需要的时间内呈现一些UI加载符号:D

理论上,如果您执行了
任务,它应该可以工作。Run(()=>{var window=new BoardTable();window.Show();});
。但是,这将创建第二个UI线程,两个窗口将永远不会再次相遇。您需要仔细划分代码以避免交叉线程错误,这无疑会发生。并且您可能会在该
任务中遇到与线程单元相关的异常。Run()
调用自身,可能需要启动一个全新的
线程。你熟悉异步和任务吗?如果你能弄清楚为什么第二个窗口需要如此长的时间来加载和优化它,那就更好了。其他事情充其量只能解决,不能改善用户体验本身。即使在上执行,10s仍然是10s不同的线程。另请参见