C#.NETのサンプルコードを掲載しています。
      
手軽にBackgroundWorkerを使う
もっと簡単にBackgroundWorkerを使いたい、スレッドのキャンセル処理を手軽に
制御したいと思っていたらこんなクラスを作っていました。
概要は下図な感じです。
手軽にBackgroundWorkerを使う

呼び出し側は別スレッドで処理したいメソッドをスレッド管理クラスに依頼します。
このときスレッド処理が終わったときに呼び出すメソッドも一緒に設定できます。
スレッド管理クラスは受け取った処理をバックグラウンドで実行します。
もしバックグラウンドで実行している最中に依頼を受けた場合はキューに登録し現在実行
している処理が終了したタイミングで開始します。

テストコード
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

using System.Threading;

namespace HP
{
    public partial class Form3 : Form
    {
        private BackgroundWorkerManage _bg = new BackgroundWorkerManage();

        public Form3()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            // バックグラウンド処理を開始
            _bg.Run(DoWork, Completed);              
        }

        private void button2_Click(object sender, EventArgs e)
        {
            _bg.Run(DoWork, null);
        }

        private void button3_Click(object sender, EventArgs e)
        {
            string str = "ArgumentTest";
            _bg.Run(DoWork, null, str);
        }

        private void button4_Click(object sender, EventArgs e)
        {
            // バックグラウンド処理をキャンセルします。
            _bg.Cancel();
        }

        private void DoWork(object sender, DoWorkEventArgs e)
        {
            if (e.Argument != null)
            {
                Console.WriteLine(" 引数は[" + e.Argument + "]です。");
            }
            Console.WriteLine("  Dowork 1");
            Thread.Sleep(3000);
            Console.WriteLine("  Dowork 2");
            if (_bg.IsCancel)
            {
                e.Cancel = true;
                return;
            }
            Thread.Sleep(1000);
            Console.WriteLine("  Dowork 3");
        }

        private void Completed(object sender, RunWorkerCompletedEventArgs e)
        {
            if (e.Cancelled)
            {
                MessageBox.Show("途中でキャンセルしました。");
            }
        }

    }
}

ソースを載せてましたがサイズが大きくなったので↓に移しました。
BackgroundWorkerManage.csです。

      

スレッド(Thread)






Copyright (C) 2011 - 2017 猫の気ままなC#日記