プログラム

C#プログラミングレッスン

C#での .NETプログラミングを易しく丁寧に解説するメールマガジンです。「C#プログラミング・レッスン」で、.NETプログラミングをマスターしましょう。

全て表示する >

【C#プログラミングレッスン】 No.145-BackgroundWorker(3)

2007/11/02

┏━┳━━━━━━━━━━━━━━━━━━━━━━━━━┳━┳━┳━┓
┃☆┃ C#プログラミングレッスン                         ┃_┃□┃×┃
┣━┻━━━━━━━━━━━━━━━━━━━━━━━━━┻━┻━┻━┫
┃ BackgroundWorker(3)                                        No.145┃
┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛

■──────────────────────────────────
■ コンソールアプリケーションでのBackgroundWorker

今までは、BackgroundWorkerコンポーネントを、GUIプログラムで利用する例
を示してきましたが、ASP.NETでも、コンソールアプリでも利用可能です。今
回は、その例を示します。今回の例は、スレッドを2つ起動する例です。

では、そのコードを示します。

using System.ComponentModel;

...

class Program {
    static void Main(string[] args) {
        MyWorker worker1 = new MyWorker("Hoo");
        worker1.Execute();
        MyWorker worker2 = new MyWorker("Bar");
        worker2.Execute();
        Console.ReadLine();
    }
}

class MyWorker {
    private BackgroundWorker worker = new BackgroundWorker();
    private string name;

    public MyWorker(string name) {
        worker.DoWork += new DoWorkEventHandler(worker_DoWork);
        worker.RunWorkerCompleted += new 
            RunWorkerCompletedEventHandler(worker_RunWorkerCompleted);
        this.name = name;
    }

    public void Execute() {
        worker.RunWorkerAsync();
    }

    private void worker_RunWorkerCompleted(object sender, 
                                    RunWorkerCompletedEventArgs e) {
        Console.Write(name + "終了 ");
    }

    // ここに本来やりたい処理を書く
    private void worker_DoWork(object sender, DoWorkEventArgs e) {
        for ( int i = 0; i < 50; i++ ) {
            Console.Write(name + i.ToString() + " ");
            System.Threading.Thread.Sleep(100);
        }
    }
}

MyWorkerクラスは、Executeメソッドが呼び出されると、スレッドを起動し、
すぐに復帰します。このプログラムを実行してみればわかりますが、worker1 
と worker2 が並行で動作していることがわかると思います。

Mainメソッドの最後に、

  Console.ReadLine(); 

があるのは、これがないと、2つのスレッド(worker1とworker2)が終了する前
に、Mainメソッドが終了してしまう(つまりはプログラム自身が終了してしま
う)ため、それを防ぐ目的です。

ここまで来るといろんな疑問が湧いてくると思います。
「Mainメソッドで2つのスレッドが終了するまで待つにはどうすれば良いのだ
  ろうか」
「その結果を受け取る方法は」
「2つのワーカースレッドで同じ変数にアクセスするにはどうすれば良いのだ
  ろうか」

これらは、すべてスレッドの同期に関わっています。
.NETでは、同期のための数多くのやり方を提供していますが、そのすべて紹介
することは、残念ながら時間がかかりすぎるため(&僕がすべて把握していな
いという理由もありあすが)いくつかの同期方法についても、次回以降説明し
ていきたいと思います。


┌─┬─────────────────────────┬─┬─┬─┐
│☆│ C#プログラミングレッスン  (ぼぼ週刊)            │_│□│×│
├─┴─────────────────────────┴─┴─┴─┤
│ Published by Gushwell.                                           │
│ Copyright (C) 2004-2007 Gushwell All rights reserved.            │
│ Microsoft MVP Visual Developer - Visual C#(Apr 2005 - Mar 2008)  │
│-------------------- Gushwell's Page ---------------------------- │
│ 窓際プログラマーの独り言  :http://blog.livedoor.jp/gushwell/    │
│ 窓際プログラマーの読書三昧:http://gushwell.jugem.jp/            │
│ Gushwell's C# Programing Page:http://gushwell.ifdef.jp/         │
│ C#デザインパターン :                                             │
│  『増補改訂版Java言語で学ぶデザインパターン入門 / 結城 浩(著)』  │
│   のサンプルコードをC#に移植したものを掲載しています。           │
│   移植後のコードの公開は、結城氏の了解を得ています。             │
│   http://blog.livedoor.jp/gushwell/archives/50333227.html        │
└─────────────────────────────────┘

規約に同意してこのメルマガに登録/解除する

メルマガ情報

創刊日:2004-08-12  
最終発行日:  
発行周期:ほぼ週刊  
Score!: 非表示   

コメント一覧コメントを書く

この記事にコメントを書く

上の画像で表示されている文字を半角英数で入力してください。

※コメントの内容はこのページに公開されます。発行者さんだけが閲覧できるものではありません。 コメントの投稿時は投稿者規約への同意が必要です。

  • コメントはありません。