【问题标题】:Progressbar for long running function WP7 C#长时间运行功能 WP7 C# 的进度条
【发布时间】:2011-08-17 14:26:09
【问题描述】:

我正在编写一个数独求解器应用程序。在某些情况下求解器的计算时间可能会超过 3 秒,这需要一个进度条。

所以我的代码:

private void solveButton_Click(object sender, RoutedEventArgs e)
{
    progressBar1.Visibility = Visibility.Visible;
    progressBar1.IsIndeterminate = true;
    mySolver.Solve(initialValue)
    progressBar1.Visilibity=Visilibity.collapsed;
    progressBar1.IsIndeterminate = false;
}

这里的代码是我实际代码的精简版。此代码不起作用,因为根本没有出现进度条。在我看来,UI 仅在事件执行完成后才会更新。如果我在求解器步骤后没有隐藏进度条,则在数独求解后会出现进度条。用 thread.sleep(1000) 替换求解器也会导致相同的 UI 更新。

感谢您的帮助。

【问题讨论】:

    标签: c# windows-phone-7 user-interface progress-bar


    【解决方案1】:

    您应该在单独的线程上启动求解器。这样,即使在求解过程中,用户界面线程也可以继续处理用户界面对象,从而可以在屏幕上绘制并更新进度条。

    【讨论】:

      【解决方案2】:

      问题是您的 UI 线程在两者之间没有空闲来显示进度条 您需要使用后台工作者来解决问题,并且在主 UI 线程中您应该显示进度条

        private void solveButton_Click(object sender, RoutedEventArgs e)
          {
             BackgroundWorker bg = new BackgroundWorker();
             bg.DoWork += new DoWorkEventHandler(DoWork);
             bg.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bg_RunWorkerCompleted);
             bg.RunWorkerAsync(); 
      
             progressBar1.Visibility = Visibility.Visible;
             progressBar1.IsIndeterminate = true;         
          }
      
      void DoWork(Object sender, DoWorkEventArgs args)
      {
           mySolver.Solve(initialValue)
      }
      
      void bg_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs args)
      {
      
          //  this method will be called once background worker has completed it's task
            progressBar1.Visilibity=Visilibity.collapsed;
            progressBar1.IsIndeterminate = false
      }
      

      【讨论】:

        【解决方案3】:

        从技术上讲,代码可以正常工作,只是您编写了错误的代码。

        您的求解器在 UI 线程上运行,因此在您再次隐藏它之前它永远没有机会绘制进度条。您需要生成一个线程(或使用后台工作线程)来释放 UI 线程,以便它可以绘制您的进度条。

        【讨论】:

          【解决方案4】:

          我对 WP7 了解不多,但如果你有一个长时间运行的函数,它需要在与 UI 不同的线程上运行。

          BackgroundWorker 可以在 WP7 上使用吗?您可以更新ProgressChanged 事件的栏并更改RunWorkerCompleted 事件的生存能力

          private void solveButton_Click(object sender, RoutedEventArgs e)
          {
              progressBar1.Visibility = Visibility.Visible;
              progressBar1.IsIndeterminate = true;
          
              solveButton.Enabled = false; //I reccomend this so the button can't be pressed twice.
          
              BackgroundWoker bw = new BackgroundWorker();
              bw.RunWorkerCompleted += bw_RunWorkerCompleted;
              bw.DoWork += bw_DoWork;
              bw.ProgressChanged += bw_ProgressChanged;
              bw.RunWorkerAsync()
          
          }
          
          private void bw_DoWork(object sender, DoWorkEventArgs e)
          {
              mySolver.Solve(initialValue, e)
          }
          
          private void bw_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
          {
              if(e.Error != null)
              {
                   //Handle any exceptions that happened in the background worker.
              }
              progressBar1.Visilibity=Visilibity.collapsed;
              progressBar1.IsIndeterminate = false;
              solveButton.Enabled = true;
              ((IDisposable)sender).Dispose();
          }
          
          private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
          {
              progressBar1.Value = e.ProgressPercentage;
          }
          
          //inside mySolver
          void Solve(somthing initialValue, DoWorkEventArgs e)
          {
              //Your solver work
              e.ReportProgress(progress); //a int from 0-100
              //more solver work
          }
          

          【讨论】:

            【解决方案5】:

            如果您仍想在 UI 线程上运行它(我不建议这样做!!),您可以使用昨天发布的 WP7 工具包中的进度条。它包含一个进度条,可以在您的 UI 线程被阻塞时工作。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2013-05-28
              • 1970-01-01
              • 1970-01-01
              • 2011-05-30
              相关资源
              最近更新 更多