プログラム

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

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

全て表示する >

【C#プログラミングレッスン】 No.146-Timer (1)

2007/11/13

┏━┳━━━━━━━━━━━━━━━━━━━━━━━━━┳━┳━┳━┓
┃☆┃ C#プログラミングレッスン                         ┃_┃□┃×┃
┣━┻━━━━━━━━━━━━━━━━━━━━━━━━━┻━┻━┻━┫
┃ System.Threading.Timer                                     No.146┃
┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛

BackgroundWorkerの説明が一通り終わったので、今回は、System.Threading.
Timerを使った非同期処理について説明します。

■──────────────────────────────────
■ System.Threading.Timerを使ったサンプル

早速、サンプルコードをご覧ください。

using System;
using System.Threading;

namespace ConsoleApplication1 {
    class Program {
        static void Main(string[] args) {
            Console.WriteLine("ThreadId = {0}",
                              Thread.CurrentThread.ManagedThreadId);
            SampleWorker sw = new SampleWorker();
            sw.Run();
            Console.WriteLine("Start");
            Console.ReadLine();

            sw.Stop();
            Console.WriteLine("Stop");
            Console.ReadLine();
        }
    }

    class SampleWorker {
        private System.Threading.Timer tm;
        private int Count;

        public void Run() {
            tm = new Timer(TimerCallbackMethod, null, 0, 2000);
        }

        public void Stop() {
            tm.Dispose();
            tm = null;
        }

        private void TimerCallbackMethod(object state) {
            Count++;
            Console.WriteLine(string.Format(
                 "{0} {1}回目, ThreadId={2}", 
                 DateTime.Now, 
                 Count, 
                 Thread.CurrentThread.ManagedThreadId));
        }
    }
}

■──────────────────────────────────
■ サンプルの結果

これを実行すると、以下のような表示がされます。

---------------------------------------------------
ThreadId = 10
Start
2007/10/05 21:58:25 1回目, ThreadId=7
2007/10/05 21:58:27 2回目, ThreadId=7
2007/10/05 21:58:29 3回目, ThreadId=7
2007/10/05 21:58:31 4回目, ThreadId=7

Stop
---------------------------------------------------

2秒おきに、TimerCallbackMethod メソッドが呼び出されているのが確認でき
ますね。
また、スレッドIDを表示していますので、MainメソッドのスレッドIDと異なる
IDが表示されていますので、別スレッドで動作していることがわかります。


■──────────────────────────────────
■ System.Threading.Timerクラスの解説

●タイマーの起動

Timerクラスのインスタンスを生成することで、タイマーを起動できます。
Timerクラスのコンストラクタは4種類ありますが、その一つを紹介します。

public Timer (TimerCallback callback,Object state,int dueTime,int period)


・第1引数 callback
 呼び出したいメソッド名を記述します。C#2.0では、わざわざ、delegateを
 new するコードを記述する必要はありません。
 引数 period で与えた間隔で、callbackが呼ばれます。
 

・ 第2引数 state
 コールバック メソッドで使用される情報を格納するオブジェクト。
 不要ならば、null。

・第3引数 dueTime
  コールバック メソッド が呼び出される前の遅延時間 (ミリ秒単位) 
  タイマをすぐに開始するには 0 を指定します。

・第4引数 period
  コールバック メソッド が呼び出される時間間隔 (ミリ秒単位)
  周期的なシグナル通知を無効にする Timeout.Infinite を指定します。 


●タイマーの終了

タイマーを終了するために、この例では、 Disposeメソッドを呼び出していま
す。
この場合は、タイマーを再利用することはできません。
再度、Timerオブジェクトを生成する必要があります。

なお、Timer.Changeメソッドを利用することで、タイマーを一時的に停止する
こともできます。

SampleWorkerクラスに、以下の2つのメソッドを追加します。

public void Pause() {
    tm.Change(Timeout.Infinite, Timeout.Infinite);
}

public void Restart() {
    tm.Change(0, 1000);
}

Mainメソッドでは、

 sw.Pause();

で、一時停止し、再開するときには、

 sw.Restart();

とします。

┌─┬─────────────────────────┬─┬─┬─┐
│☆│ 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!: 非表示   

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

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

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

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

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