由于当然它在同一个线程上被冻结的不确定进度条有什么用处?有没有办法让它继续运行?可能是多线程的?
答案 0 :(得分:1)
线程几乎肯定是解决方案,是 - 或异步操作。你肯定不应该在UI线程中执行长时间运行的任务。
一种常见的模式是使用BackgroundWorker
作为后台任务 - 它使得将进度报告回UI线程变得特别容易。
答案 1 :(得分:1)
答案是使用一个单独的线程。我没有意识到我可以创建多个STA线程。我创建了一个简单的委托线程气泡,只要我想隐藏进度窗口,就会弹出它。
protected void ShowProgress()
{
if (_progressThread != null)
return;
_progressThread = new Thread(() =>
{
var progressShell = Program.ViewFactory.CreateDialogShell();
progressShell.DataContext = new ProgressViewModel(this);
progressShell.Show();
Dispatcher.Run();
});
_progressThread.SetApartmentState(ApartmentState.STA);
_progressThread.Start();
}
protected void HideProgress()
{
if (_progressThread == null)
return;
_progressThread.Abort();
_progressThread = null;
}
答案 2 :(得分:0)
我在这种情况下使用的代码
ProgressIndicator.Visibility = System.Windows.Visibility.Visible;
ThreadPool.QueueUserWorkItem
(
delegate
{
// Perform slow action
Thread.Sleep(5000);
this.Dispatcher.Invoke(
new Action(delegate()
{
// Insert UI related activity here.
// ....
ProgressIndicator.Visibility = System.Windows.Visibility.Collapsed;
}
));
}
);
答案 3 :(得分:0)
不确定问题的详细信息,但我有一个类似的问题(可能?),我有一个ListView,需要显示许多(数百)缩略图。缩略图是从文件系统上的数码照片生成的,因此创建许多缩略图会在加载时锁定UI。我使用占位符图像(带有字符串“Loading ...”的小型JPG)创建了ListView中的所有对象,并且只有足够的数据,以便后台工作人员更新中的每个对象带有缩略图的ListView,以及可能来自文件的其他数据(占位符对象的数据来自简单的数据库查询)。用户获得在加载发生时响应的UI。这很好用,因为加载数百个对象的占位符数据足够快(几秒钟),而非常大的数据集可能需要几分钟。我不了解你的情况,知道这是否有用......