我有以下代码:
progressBar1.Minimum = 0;
progressBar1.Maximum = Results.Count;
foreach (MyClass cls in Results)
{
progressBar1.Value += 1;
// Go to DB and get large quantity of data
cls.GetHistoryData();
}
我想要做的是将处理转移到另一个线程,以便progressBar1正确更新。我发现article意味着我应该可以在进度条上使用Invoke方法,但似乎没有。
答案 0 :(得分:2)
你应该检查BackgroundWorker课程。它支持进度并正确处理线程之间的通信。
答案 1 :(得分:2)
如果将进度条绑定到数据属性,则无需手动切换线程上下文。 WPF绑定引擎将自动为您执行此操作。
<ProgressBar Value={Binding Progress} />
然后在你的主题中:
foreach (MyClass cls in Results)
{
// databinding will automatically marshal to UI thread
this.Progress++;
cls.GetHistoryData();
}
在大多数情况下,这比使用Dispatcher.Invoke或BackgroundWorker
自行编组更清晰,更不容易出错答案 2 :(得分:0)
你可以这样开始一个新线程:
Thread t1 = new Thread(methodnametocall);
t1.start();
void methodnametocall()
{
this.Invoke((MethodInvoker)delegate
{
control to update;
}
});
答案 3 :(得分:0)
试试这个
progressBar1.Minimum = 0;
progressBar1.Maximum = Results.Count;
foreach (MyClass cls in Results)
{
ThreadPool.QueueUserWorkItem((o) =>
{
progressBar1.Dispatcher.BeginInvoke(
(Action) (() => progressBar1.Value += 1));
cls.GetHistoryData();
});
}
答案 4 :(得分:0)
您链接的文章是一个winforms示例,但您正在制作WPF应用程序。在您的情况下,您应该考虑使用Dispatcher
类,通过控件的Dispatcher
属性。