2017-10-15 4 views
1

私は半年前にC#で作業しています。私は学んでいます。 私は私の仕事で私を助けているプログラムを持っています。それは私の職場で4種類のデータベースと通信します。それは完璧に動作していますが、今はもっとクーラーにしたいと思っていますが、私のメソッドは自分のデータベースと通信している間にUIをフリーズするので、プログレスリングをセットアップしたいときに立ち往生します。 私はバックグラウンドワーカーをセットアップしたいと思っています。私はボタンを押したときにbackgroundworkerがUIを更新し、そのための進捗状況を設定する方法を教えてください。

public partial class MainWindow : MetroWindow 
{ 
    BackgroundWorker workerThread = null; 

    public MainWindow() 
    { 
     InitializeComponent(); 
     InstantiateWorkerThread(); 

     progressrinG.IsActive = true; 
    } 
    private void InstantiateWorkerThread() 
    { 
     workerThread = new BackgroundWorker(); 
     workerThread.ProgressChanged += WorkerThread_ProgressChanged; 
     workerThread.DoWork += WorkerThread_DoWork; 
     workerThread.RunWorkerCompleted += WorkerThread_RunWorkerCompleted; 
     workerThread.WorkerReportsProgress = true; 
     //workerThread.WorkerSupportsCancellation = true; 
    } 

    private void WorkerThread_ProgressChanged(object sender, ProgressChangedEventArgs e) 
    { 

    } 
    private void WorkerThread_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) 
    { 

    } 
    private void WorkerThread_DoWork(object sender, DoWorkEventArgs e) 
    { 
     //My huge method,asking 4 database that would update UI too 
     //... Textboxes,Grids,Expanders. 
    } 

    private void Button3_Click(object sender, RoutedEventArgs e) 
    { 
     workerThread.RunWorkerAsync(); 

     while (workerThread.IsBusy) 
     { 
      progressrinG.Visibility = Visibility.Visible; 
     } 
    } 
} 

はしても起動して、5〜10秒後にそれは私のメソッドを終了しますが、それをしている間、私のアプリケーションは、凍結されていると私はprogressringを参照してくださいいけません。

どうすればいいですか?または私は何をすべきですか?前もって感謝します!

答えて

1

WorkerThread_DoWorkのワーカースレッドからUIを更新しないで、WorkerThread_ProgressChangedのUIスレッドを使用してください。

WorkerThread_ProgressChangedが呼び出されるように、任意のパーセント進捗状況を渡して労働者から定期的にworker.ReportProgressを呼び出します。 UIの更新が枯渇するのを防ぐため、パーセント差が変更された場合にのみUIを更新してください。

+0

ここでサンプルを見つけようとしていますが、私は自分のメソッドを編集しようとします。ありがとうございました。 Upvoted。 – Tamas555

0

申し訳ありませんが、すでに例が見つかりましたが、最近これを自分で行っています。わずかに異なりますが、必要なものに合わせることができます。私はボタンをクリックして自分のメソッドを実行するスピナーを持っているので、私はMickyDのようにReportProgressを使って更新するラベルを持っています。

 private void backgroundWorker_ProgressChanged(object sender, ProgressChangedEventArgs e) 
    { 
     progress = e.ProgressPercentage; 
     progressLabel.Text = "Creating User " + totalUserCreatedCount + " of " + rowCount; 
    } 

私は再びループの先頭で起動するたびに報告したループを通過します。私はこのようにProgressChangedを呼び出します

backgroundWorker.ReportProgress((100 * i)/rowCount); 

行数はループを回りたい回数の合計です。

これは意味がありますか?

関連する問題