WPF中的线程和UI

时间:2009-09-09 17:03:44

标签: wpf multithreading

这是带有按钮和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中,复制描述正在改变,同时进度条必须更新。我想要类似于那。所以我想如果我能理解这样的小例子,那么我可以排序需要一个)

1 个答案:

答案 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线程。因此,通过将上述代码用于您自己的需求,您应该解决您的问题。