場合によっては、外部ライブラリで実行中の計算の進行状況を表示する必要があるかもしれません。ただし、計算方法を進行状況バーの直接の依存関係から切り離したいと考えています。
次の例を考えてみましょう:
<code class="language-c#">private void CaluculateAll(System.Windows.Forms.ProgressBar progressBar) { progressBar.Maximum = 100000; progressBar.Step = 1; for (int j = 0; j < 100000; j++) { // Perform some calculation progressBar.PerformStep(); } }</code>
このアプローチでは進行状況のレポートが確実に行われますが、CaluculateAll
メソッドと進行状況バーが緊密に結び付けられます。この問題を解決するには、BackgroundWorker クラスの使用を検討してください:
<code class="language-c#">private void button1_Click(object sender, EventArgs e) { progressBar1.Maximum = 100; progressBar1.Step = 1; progressBar1.Value = 0; backgroundWorker.RunWorkerAsync(); } private void backgroundWorker_DoWork(object sender, DoWorkEventArgs e) { var backgroundWorker = sender as BackgroundWorker; for (int j = 0; j < 100; j++) { // Perform some calculation backgroundWorker.ReportProgress(j); } } private void backgroundWorker_ProgressChanged(object sender, ProgressChangedEventArgs e) { progressBar1.Value = e.ProgressPercentage; }</code>
この分離により、増分進行状況レポートのメカニズムを提供しながら、計算を UI から独立して実行できるようになります。 BackgroundWorker は、計算中にインターフェースがフリーズするのを防ぐために必要なスレッド化と同期を処理します。
BackgroundWorker を効果的に使用すると、コードベースの柔軟性や分離に影響を与えることなく、進行状況バーをシームレスに更新できます。
以上がC# でプログレスバーの更新を外部計算から切り離す方法は?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。