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();
           
        }

 
    }
}