スレッドを作成して実行する - C#
C#でスレッドを作成し実行するマルチスレッドのプログラムのコードを紹介します。
概要
C#でスレッド処理を実行する場合には、Threadクラスを利用します。
Threadクラスのインスタンスを作成し、作成時のコンストラクタに実行したい処理の
ThreadStart
デリゲートを与えます。
作成されたThreadクラスのインスタンスオブジェクトの
Start()
メソッドを実行することでスレッドの処理が開始できます。
複数のスレッドを同時に実行することで、マルチスレッドが実現できます。
プログラム例1
UI
下図のUIを作成します。ボタンと複数行のテキストボックスを配置します。
コード
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Threading;
namespace ExecThread
{
public partial class FormExecThread1 : Form
{
public FormExecThread1()
{
InitializeComponent();
}
private void Button1_Click(object sender, EventArgs e)
{
Thread t = new Thread(new ThreadStart(ThreadProc));
t.Start(); //スレッド実行
textBox1.Text += "End";
}
private void ThreadProc()
{
System.Threading.Thread.Sleep(10000); //時間のかかる処理
}
}
}
解説
下記コードでスレッドを作成します。ThreadStartクラスのコンストラクタの引数にスレッド開始時の実行メソッドを与えます。
Thread t = new Thread(new ThreadStart(ThreadProc));
スレッドクラスのStartメソッドでスレッドを実行開始します。
t.Start();
スレッドは実行されますが、メインスレッドも並行して実行されるため、下記の行が実行されすぐにテキストボックスに"End"の文字が表示されます。
textBox1.Text += "End";
実行結果
上記のプログラムを実行します。下図のウィンドウが表示されます。[button1]をクリックします。
スレッドが作成され実行されます。サブスレッドでは10秒停止する処理が実行されますが、メインスレッドとは独立して動作するため、メインスレッドはすぐに制御が戻り"End"の文字列がテキストボックスに表示されます。
プログラム例2
先の例の通り、スレッドの処理は別クラスにする必要はありませんが、コードを見やすくするため、別のクラスに記述することが多いです。
コード
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Threading;
namespace ExecThread
{
public partial class FormExecThread2 : Form
{
public FormExecThread2()
{
InitializeComponent();
}
private void Button1_Click(object sender, EventArgs e)
{
MyThread m = new MyThread(); //スレッドクラスの作成
Thread t = new Thread(new ThreadStart(m.exec));
t.Start(); //スレッド実行
textBox1.Text += "End";
}
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ThreadCheck
{
class MyThread
{
public void exec()
{
System.Threading.Thread.Sleep(10000); //時間のかかる処理
}
}
}
解説
下記コードでスレッドの処理が実装されているクラスを作成します。
MyThread m = new MyThread();
下記コードでスレッドを作成します。 ThreadStartクラスのコンストラクタの引数にスレッド開始時の実行関数を与えます。
Thread t = new Thread(new ThreadStart(m.exec));
スレッドを実行します。
t.Start();
スレッドは実行されますが、メインスレッドも並行して実行されるため、下記の行が実行されすぐにテキストボックスに"End"の文字が表示されます。
textBox1.Text += "End";
実行結果
上記のプログラムを実行します。下図のウィンドウが表示されます。[button1]をクリックします。先の例と同様の結果になります。
著者
iPentecのメインプログラマー
C#, ASP.NET の開発がメイン、少し前まではDelphiを愛用