你几乎被卡住了,因为你只能在主线程上加载对象,所以我认为你不会让它加载得更快。
你可以做的是分散用户的注意力:我有一个动画启动屏幕,它需要大约 10 秒才能完成动画序列。这有多种用途:
- 它显示了用户的动作 - 所以他们有一个视觉提示,表明某事正在发生
- 它分散了他们的注意力并填充了初始负载所占用的空间
为确保动画流畅,您需要创建第二个调度程序。这是我的做法:
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 类设置为我的启动对象。
我在 App 中的 OnStartup 方法结束时关闭了初始屏幕:
AppEntry.SplashWindow.Dispatcher.BeginInvoke(DispatcherPriority.Background,
new Action(() => AppEntry.SplashWindow.Close()));
这更快吗?否 用户是否认为它更快?是的
有时,如果你不能给他们速度,你可以给他们活动。这是一个很好的安慰剂。