WPF进度控制调度仍要堵塞UI线程

我使用WPF试图在更新进度条后台运行一个线程。 我不婉阻塞UI线程,所以我运行下面的代码。 然而,仍然UI受阻。 它似乎很简单,我究竟做错了什么?

Dispatcher.BeginInvoke( (ThreadStart) delegate(){ for(double i = progressBar_ChangeProgress.Minimum; i < progressBar_ChangeProgress.Maximum; i++) { for (int b = 0; b < 100000000; b++) { } progressBar_ChangeProgress.Value = i; } EnableAllInputControls(); }, DispatcherPriority.Background);

--------------解决方案-------------

为什么不利用BackgroundWorker在这种情况下...

void Go()
{
BackgroundWorker worker = new BackgroundWorker();
worker.WorkerReportsProgress = true;
worker.ProgressChanged += new ProgressChangedEventHandler(worker_ProgressChanged);
worker.DoWork += new DoWorkEventHandler(worker_DoWork);
worker.RunWorkerAsync();
}

void worker_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
progressBar_ChangeProgress.Value = e.ProgressPercentage;
}

void worker_DoWork(object sender, DoWorkEventArgs e)
{
BackgroundWorker worker = sender as BackgroundWorker;
for (int b = 0; b < 100; b++)
{
Thread.Sleep(100);
worker.ReportProgress(b);
}
}

更新:

如果你想使用的Dispatcher ; 设置优先级为Normal ,并在后台线程然后调用UI线程上的方法来提供更新进行处理。

void Go()
{
ThreadStart start = delegate()
{
//this is taking place on the background thread
for (int i = 0; i < 100; i++)
{
//this is slowing things down; no real relevance
Thread.Sleep(100);

//this will marshal us back to the UI thread
Dispatcher.Invoke(DispatcherPriority.Normal,
new Action<int>(Update), i
);
}

};

new Thread(start).Start();
}

void Update(int value)
{
//this is taking place on the UI thread
_progressBar.Value = value;
}

Dispatcher只是为了在以后的时间运行位的UI线程上代码的机制。 优先级你在管制站时,它会被执行,而不是任何类型的线程的优先级。 您的代理在这种情况下,内容越来越UI线程上运行。 使用BackgroundWorker由亚伦提到肯定会有所帮助。

此外,我可能会指出,通常一个进度条显示任务多么接近完成。 如果你不知道的东西多长时间要采取或者没有衡量进展的方式,你可以使用一个不确定的进度条。 只有当你有一些有意义的信息更新的价值。 (虽然你可能只是提供了这个用于演示目的)

里面的BeginInvoke一切都被在UI线程上运行,因此它会阻止。

你需要做的是运行的任何时间密集型代码在你的线程,然后只更新调用内部的UI。

你想要更多的东西是这样的:

for (double i = progressBar_ChangeProgress.Minimum;
i < progressBar_ChangeProgress.Maximum;
i++)
{
for (int b = 0; b < 100000000; b++) { }
Dispatcher.Invoke((ThreadStart) delegate(){
progressBar_ChangeProgress.Value = i;
});
}

分类:C# 时间:2015-03-15 人气:2
本文关键词: .NET,C#,WPF,WPF控件
分享到:

相关文章

Copyright (C) 55228885.com, All Rights Reserved.

55228885 版权所有 京ICP备15002868号

processed in 0.892 (s). 10 q(s)