gpt4 book ai didi

WPF 优化 UI 线程上的加载

转载 作者:行者123 更新时间:2023-12-02 03:19:00 24 4
gpt4 key购买 nike

我正在尝试优化 WPF prism 应用程序的加载时间。加载基本上是一个循环,使用反射创建 UI 元素的实例,然后将它们添加到选项卡控件中的主窗口(外壳)。

由于我们仅限于使用单个线程来创建所有对象,那么加速加载/创建更好的用户体验的最佳方法是什么?

这些是我到目前为止的选择:

  1. 使用延迟加载。仅在用户第一次单击选项卡时加载该选项卡。但第一次打开时会有 4-5 秒的延迟,因为它会根据需要进行初始化。

  2. 缓存所有反射调用。我确实这样做了,但它根本没有加快任何速度。大部分时间发生在控件的渲染过程中...

对于这个棘手的问题,任何建议都将不胜感激。

最佳答案

你几乎陷入困境,因为你只能在主线程上加载对象,所以我认为你不会让它加载得更快。

您可以做的就是分散用户的注意力:我有一个动画启动屏幕,大约需要 10 秒才能完成动画序列。这有几个目的:

  1. 它显示用户 Action - 因此他们可以通过视觉提示知道正在发生事情
  2. 它会分散他们的注意力并填充初始负载所占用的空间

为了确保动画流畅,您需要创建第二个调度程序。我是这样做的:

public class AppEntry : Application
{
private static ManualResetEvent _resetSplashCreated;

internal static Thread SplashThread { get; set; }

internal static SplashWindow SplashWindow { get; set; }

private static void ShowSplash()
{
SplashWindow = new SplashWindow();
SplashWindow.Show();
_resetSplashCreated.Set();
Dispatcher.Run();
}

[STAThread]
public static void Main()
{
_resetSplashCreated = new ManualResetEvent(false);
SplashThread = new Thread(ShowSplash);
SplashThread.SetApartmentState(ApartmentState.STA);
SplashThread.IsBackground = true;
SplashThread.Name = "Splash Screen";
SplashThread.Start();

_resetSplashCreated.WaitOne();

var app = new App();
app.DispatcherUnhandledException += new DispatcherUnhandledExceptionEventHandler(app_DispatcherUnhandledException);
app.InitializeComponent();
app.Run();

}

static void app_DispatcherUnhandledException(object sender, DispatcherUnhandledExceptionEventArgs e)
{
// MessageBox.Show(e.Exception.StackTrace);
}
}

我在“项目属性/应用程序”选项卡中将 AppEntry 类设置为我的启动对象。
我在应用程序中的 OnStartup 方法结束时关闭启动屏幕:

 AppEntry.SplashWindow.Dispatcher.BeginInvoke(DispatcherPriority.Background,
new Action(() => AppEntry.SplashWindow.Close()));

这样更快吗?不用户认为这样更快吗?是的

有时,如果你不能给他们速度,你可以给他们事件。这是一个很好的安慰剂。

关于WPF 优化 UI 线程上的加载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13163173/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com