这是带有按钮和3个进度条的XAML
TestBtn
这是更新3个进度条的线程..
Thread thread = new Thread(
new ThreadStart(
delegate()
{
progressBar1.Dispatcher.BeginInvoke(System.Windows.Threading.DispatcherPriority.Normal,
new Action(
delegate()
{
int x=0;
while(true)
{
x++;
Thread.Sleep(50);
progressBar1.Value = x;
if (x>100)
{
break;
}
}
MessageBox.Show(" Complete ");
}
));
progressBar2.Dispatcher.BeginInvoke(System.Windows.Threading.DispatcherPriority.Normal,
new Action(
delegate()
{
int y = 0;
while (true)
{
Thread.Sleep(50);
y = y + 2;
progressBar2.Value = y;
if (y > 100)
{
break;
}
}
MessageBox.Show(" Complete ");
}
));
progressBar3.Dispatcher.BeginInvoke(System.Windows.Threading.DispatcherPriority.Normal,
new Action(
delegate()
{
int z = 0;
while (true)
{
Thread.Sleep(50);
z = z + 3;
progressBar3.Value = z;
if (z > 100)
{
break;
}
}
MessageBox.Show(" Complete ");
}
));
)
);//end of thread
thread.Start();
}
当我运行它时,所有3个进度条最后都更新为100%(所有进度条同时直接达到100)并且它没有显示从0到100的任何增量。
我需要的是一个包含3个项目的线程,其中每个都会同时更新UI。所以这里同时所有这3个进度条都必须启动,并且它们已根据循环完成。 (当我们复制文件时,在UI中,复制描述正在改变,同时进度条必须更新。我想要类似于那。所以我想如果我能理解这样的小例子,那么我可以排序需要一个)
答案 0 :(得分:1)
您可以随时使用BackgroundWorker
,例如Figo Fei(略有改动):
private void button1_Click(object sender, EventArgs e)
{
progressBar1.Maximum = 100;
backgroundWorker1.WorkerReportsProgress = true;
backgroundWorker1.ProgressChanged += new ProgressChangedEventHandler(backgroundWorker1_ProgressChanged);
backgroundWorker1.DoWork += new DoWorkEventHandler(backgroundWorker1_DoWork);
backgroundWorker1.RunWorkerCompleted += new RunWorkerCompletedEventHandler(backgroundWorker1_RunWorkerCompleted);
backgroundWorker1.RunWorkerAsync();
}
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
// This would be the load process, where you put your Load methods into.
// You would report progress as something loads.
for (int i = 0; i < 100; i++)
{
Thread.Sleep(100);
backgroundWorker1.ReportProgress(i); //run in back thread
}
}
private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e) //call back method
{
progressBar1.Value = e.ProgressPercentage;
}
private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) //call back method
{
progressBar1.Value = progressBar1.Maximum;
}
关于BackgroundWorker的一个可爱的事情是它确实在工作线程上运行了所有“繁重的工作”,但报告回UI线程。因此,通过将上述代码用于您自己的需求,您应该解决您的问题。