C# 入門 & 実践 / C sharp

501-4. ParameterizedThreadStart でパラメータを渡す!


counter に スリープタイムを渡します。

ThreadStart ではなくParameterizedThreadStartを使用して
Start( object )の形で変数を渡します。
object なので、classでもなんでもOKです。

        private void goThread()
        {
            Thread t1 = new Thread(new ParameterizedThreadStart(counter));
            t1.Name = "T1";
            
            Thread t2 = new Thread(new ParameterizedThreadStart(counter));
            t2.Name = "T2";
            t1.Start(10);
            t2.Start(20);
            // 終わるまで待つ。
            t1.Join();
            t2.Join();

            this.textBox1.Text = res;


        }
        private void counter(object sleep_o )
        {
            int sleep_i = (int)sleep_o;
            try
            {
                for (int i = 0; i < 10; i++)
                {
                    Thread.Sleep( sleep_i );
                    int temp = Interlocked.Increment(ref count);
                    lock (this)
                    {
                        res += Thread.CurrentThread.Name + " : " + count + "\r\n";
                    }
                }
            }
            finally
            {
                end_check++;
            }
        }
こうすると、T1のほうが2倍の速さで終わって、その後は、T2だけが処理していますね。
T1 : 1
T2 : 2
T1 : 3
T1 : 4
T2 : 5
T1 : 6
T1 : 7
T2 : 8
T1 : 9
T1 : 10
T2 : 11
T1 : 12
T1 : 13
T2 : 14
T1 : 15
T2 : 16
T2 : 17
T2 : 18
T2 : 19
T2 : 20

だいたいこれだけで、OKです。

さらに、細かく開始・終了を管理したい場合は、Moniterを利用します!
次回はMoniterを利用します。



501-3. Interlocked で数値増減 « マルチスレッド同期 » 501-5. Moniterで同期管理


C# 入門 & 実践 / C sharp