BackgroundWorker でプログレスバーを更新
windows formアプリ作ってたときに困った。
やり方はいくつかあるみたいだったけどBackgroundWorkerが一番楽だと思う( ̄ω ̄;)
using System; using System.ComponentModel; using System.Threading; using System.Windows.Forms; namespace OperateProgressBar { public partial class Form1 : Form { public Form1() { InitializeComponent(); } // Form1上に配置されたボタンのクリックイベントハンドラ private void OnButtonClick(object sender, EventArgs e) { // 非同期処理中はボタンを非活性にしておく。 this.button1.Enabled = false; // 非同期で実行したい処理をこれに登録する。 BackgroundWorker worker = new BackgroundWorker(); // Form1とは別のスレッドで実行される。 worker.DoWork += ((_sender, _e) => { for(int i= 1; i<=100; i++) { // 重めの処理のつもり Thread.Sleep(20); // ProgressChangedイベントを発行。 // パラメータのiは処理の進捗(%)。 worker.ReportProgress(i); } }); // 処理の進捗が更新されたら呼ばれる。 // Form1のスレッドで実行される。 worker.ProgressChanged +=((_sender, _e) => { this.progressBar1.Value = _e.ProgressPercentage; }); // DoWorkに登録した処理が終わったときに呼ばれる。 // Form1のスレッドで実行される worker.RunWorkerCompleted += ((_sender, _e) => { this.button1.Enabled = true; worker.Dispose(); MessageBox.Show("オワタ!"); }); // workerから進捗の更新を通知できるように設定する。 worker.WorkerReportsProgress = true; // DoWorkイベントを発行して非同期処理を開始。 worker.RunWorkerAsync(); } } }