【发布时间】:2021-01-20 08:49:17
【问题描述】:
我正在尝试执行标题中描述的任务。 HeaviWindow 执行一些繁重的任务,因此在任务完成之前不会显示。这次我想用动画加载器显示一个启动画面。
到目前为止,我使用了以下构造:
private RunHeavyTask()
{
ShowSplashScreen("Please wait...");
var dialog = new HeaviWindow();
dialog.ShowDialog();
}
private void ShowSplashScreen(string str)
{
Thread newWindowThread = new Thread(new ParameterizedThreadStart(ThreadStartingPoint));
newWindowThread.SetApartmentState(ApartmentState.STA);
newWindowThread.IsBackground = true;
newWindowThread.Start(str);
}
private void ThreadStartingPoint(object str)
{
splash = new WaitWindow((string)str);
splash.Show();
System.Windows.Threading.Dispatcher.Run();
}
但突然发现,在运行线程时,所有其他后台线程都停止工作。
我已尝试为此目的使用Task:
private void ShowSplashScreen(string str)
Task.Run(() =>
{
Application.Current.Dispatcher.Invoke(delegate
{
splash = new WaitWindow((string)str);
splash.ShowDialog();
});
});
}
但在繁重的对话框完成任务之前不会显示启动画面。如果我使用BackgroundWorker,结果相同。
所以我的问题 - 我如何在另一个任务中运行繁重的任务时显示启动对话框。启动对话框使用了一些动画,因此需要更新。
【问题讨论】:
-
But splash screen not displayed until the heavy dialog finish the task调用ShowDialog会阻塞执行直到它完成,这是正常的。 -
@Çöđěxěŕ 确切地说,问题是我怎样才能避免这种情况。
-
这里更重要的是你的
HeaviWindow中发生了什么,一个对话框需要在 UI 线程中显示,但是如果你的HeaviWindow正在执行它是在 UI 线程上工作,或者它是根本不使用线程,那么您启动新线程的调用必须等待HeaviWindow释放 UI 线程以显示启动屏幕。 -
@ChrisSchaller 直到任务完成才显示 HeavyWindow,这对我来说没问题,但我想显示启动画面。当 HeavyWindow 完成任务时,它会显示出来,所以我现在关闭了启动画面。
-
为什么要从另一个线程启动启动画面?这不是必需的,也没有多大意义。您应该在启动工作线程之前显示该窗口。为什么这不适合你。
标签: c# wpf multithreading task