[英]Progressbar for long running function WP7 C#
我正在編寫一個數獨求解器應用程序。 在某些情況下,求解器的計算時間可能超過 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 更新。
謝謝你的幫助。
問題是您的 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 了解不多,但如果你有一個長期運行的 function,它需要在與 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 線程被阻止時工作。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.