Поток и пользовательский интерфейс в WPF - PullRequest
0 голосов
/ 09 сентября 2009

Это XAML с кнопкой и 3 индикаторами выполнения

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 элементами, каждый из которых будет обновлять пользовательский интерфейс в одно и то же время. Так что здесь, в одно и то же время, все эти 3 индикатора выполнения должны запускаться и заканчиваться в соответствии с циклом. (Когда мы копируем файлы, в пользовательском интерфейсе описание копирования меняется одновременно с обновлением индикатора выполнения. Я хочу, чтобы это было похоже на это. Так что я думаю, что если я смогу понять такой небольшой пример, то я могу отсортировать требуется)

1 Ответ

1 голос
/ 09 сентября 2009

Вы всегда можете использовать BackgroundWorker, например, Фигу Фэй (слегка изменено):

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 заключается в том, что он выполняет всю «тяжелую работу» в рабочем потоке, но возвращает отчет в поток пользовательского интерфейса. Поэтому, используя приведенный выше код для собственных нужд, вы должны решить свою проблему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...