c# - 预加载 WPF 窗口(可能在其他线程中)以提高性能

标签 c# wpf windows multithreading performance

我有一个 WPF 窗口,它需要花费大量时间来创建和显示。用户应该能够打开一个或多个此窗口。 现在,我正在寻找一种提高性能的方法。一个想法是在应用程序启动时创建两个这样的窗口(当它显示闪屏时)。在我只需要显示和隐藏这个窗口(并更改附加的 View 模型)之后。这应该不是问题。但是当用户使用应用程序并且他使用在应用程序启动时加载的两个窗口时,我应该在后台加载该窗口的第三个实例。现在,应用程序在加载第三个(或 4 个或 5 个等)时不应被阻塞。现在,我正在寻找一种方法来做到这一点。是否可以在另一个线程中加载窗口,然后将其传输到主 UI 线程? 还是有其他方案可以达到目标?

感谢您的帮助。

最好的问候,托马斯

最佳答案

我有一个辅助 wpf 窗口,它在第一次显示时需要很长时间(2 秒)才能打开,并且在后续加载时花费的时间很少。结果证明是由于加载了扩展工具包程序集(以及其他几个)。为了修复它,我将以下内容添加到我的 App.xaml.cs 中:

        var thread = new Thread(() =>
        {//Force runtime to pre-load all resources for secondary windows so they will load as fast as possible
            new SecondaryForm1();
            new SecondaryForm2();
        });
        thread.SetApartmentState(ApartmentState.STA);
        thread.Priority = ThreadPriority.Lowest;//We don't want prefetching to delay showing of primary window
        thread.Start();
        //Now start primary window

更改后,副窗口将在大约 10 毫秒后首次显示。起初我不喜欢冗余实例化的外观,但真的..有什么坏处?还有许多其他因素可能会延迟新窗口的显示,但这当然值得一试。我的想法来自 this question .

关于c# - 预加载 WPF 窗口(可能在其他线程中)以提高性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6296234/

相关文章:

c# - 在 C# 中创建自定义应用程序链接(ed2k 链接样式)

windows - 在 Windows 中,是什么让 qmake 将 "d"附加到调试目标?

c# - 在 C# 中获取 OutOfMemoryException 的最简单方法是什么?

c# - 如何在绑定(bind)的 ItemsControl 中更改 ZIndex?

windows - 使用 Vim 进行提交的错误

wpf - WCF如何检测客户端是否存在

c# - WPF 数据绑定(bind) : Nullable Int still gets a validation error?

c# - 选择合适的微 Controller 来连接 RFID 和用 C# 开发的软件

c# - 获取发送控件的名称属性以用于不透明度更改

c# - 在 C#/Linq 中搜索子类型的集合