用于长时间运行功能的进度条WP7 c#

本文关键字:WP7 长时间 运行 功能 用于 | 更新日期: 2023-09-27 18:05:46

我正在编写一个数独求解器应用程序。在某些情况下,求解器的计算时间可能超过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更新。

谢谢你的帮助。

用于长时间运行功能的进度条WP7 c#

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

问题是你的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
}

从技术上讲,代码工作得很好,您只是写错了代码。

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

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

你在WP7上可以使用BackgroundWorker吗?您可以更新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
}

如果你仍然想在UI线程上运行它(我不推荐!!)你可以使用昨天发布的WP7工具包中的进度条。它包含一个进度条,当你的UI线程被阻塞时,它会工作。