Hope is a Dream. Dream is a Hope.

非公開ふぃふぃ工房ブログは再開しました。

C#でバックグラウンド処理をするためのテンプレート

C#でバックグラウンド処理をするためのテンプレート

時間のかかる処理をバックグラウンドで実行するには?[2.0のみ、C#、VB] - @IT

バックグラウンド処理を途中でキャンセルするには?[2.0のみ、C#、VB] - @IT

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Windows.Forms;

namespace WindowsFormsApp1
{
    /// <summary>
    /// ユーザ定義のBackgroundWorkerクラス
    /// 処理中のデータを保持させたりしたい
    /// </summary>
    public class MyBackgroundWorker : BackgroundWorker
    {
        public int id;
        public int count;
        public MyBackgroundWorker(int id)
        {
            this.id = id;
            this.count = 0;
        }

    }

    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();


            // 増産方法
            List<BackgroundWorker> workers = new List<BackgroundWorker>();
            int workers_number = 10;
            for (int i = 0; i < workers_number; i++)
            {
                BackgroundWorker new_worker = new MyBackgroundWorker(i);
                new_worker.DoWork += new DoWorkEventHandler(backgroundWorker1_DoWork);
                new_worker.ProgressChanged += new ProgressChangedEventHandler(backgroundWorker1_ProgressChanged);
                new_worker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(backgroundWorker1_RunWorkerCompleted);
                workers.Add(new_worker);
            }

        }


        /// <summary>
        /// ワーカーの起動
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void button1_Click(object sender, EventArgs e)
        {
            backgroundWorker1.RunWorkerAsync(100); // 引数を渡している
        }

        /// <summary>
        /// キャンセル操作
        /// </summary>
        private void button_Cancel_Click(object sender, EventArgs e)
        {
            backgroundWorker1.CancelAsync();
        }

        /// <summary>
        /// バックグラウンド処理
        /// </summary>
        private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
        {

            int bgWorkerArg = (int)e.Argument;

            BackgroundWorker worker = (BackgroundWorker)sender;

            for (int i = 0; i < bgWorkerArg; i++)
            {
                if (backgroundWorker1.CancellationPending)
                {
                    e.Cancel = true;
                    return;

                }

                System.Threading.Thread.Sleep(100);

                int percentage = (int)(100.0 * i / (bgWorkerArg - 1));
                worker.ReportProgress(percentage);

            }
            e.Result = "All Collect!";
        }

        /// <summary>
        /// 定期監視
        /// </summary>
        private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
        {
            progressBar1.Value = e.ProgressPercentage;
        }

        /// <summary>
        /// 完了イベント
        /// </summary>
        private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
        {
            BackgroundWorker worker = (BackgroundWorker)sender;

            if (e.Cancelled)
            {
                this.textBox1.Text = "キャンセルされました";
            }
            else
            {
                this.textBox1.Text = e.Result.ToString();
            }

            progressBar1.Value = 0;

        }


    }
}