佐々木屋

技術的なことから趣味まで色々書きます

非同期処理、マルチスレッド(古の手法:Thread)

<Threadクラスの基本>

Threadクラスは.NET Framework1.1からある一番古い手法です。現在はほとんど使用されていないのではないでしょうか。
むしろ今どきこれをつかって非同期処理をやると考えているのであれば、間違いなく止めた方がいいでしょう。Threadクラスはスレッド自体の管理・運用をプログラマが面倒を見なければならないという面倒臭さがあります。

public static void Main() {
    System.Threading.Thread testThread = new System.Threading.Thread(new System.Threading.ThreadStart(HeavyProc));
    testThread.Start();
    for (int i = 0; i <= 5; ++i) {
        System.Threading.Thread.Sleep(1000);
        Console.WriteLine("Piyo");
    }
}

private void HeavyProc() {
    for (int i = 0; i <= 5; ++i) {
        System.Threading.Thread.Sleep(1000);
        Console.WriteLine("Hoge");
    }
}
 Public Shared Sub Main()
    Dim testThread As New System.Threading.Thread(New System.Threading.ThreadStart(AddressOf HeavyProc))
    testThread.Start()
    For i As Integer = 0 To 5
        System.Threading.Thread.Sleep(1000)
        Console.WriteLine("Piyo")
    Next
End Sub

Private Sub HeavyProc()
    For i As Integer = 0 To 5
        System.Threading.Thread.Sleep(1000)
        Console.WriteLine("Hoge")
    Next
End Sub


結果は以下の通り、PiyoとHogeがだいたい交互に6回ずつ出現します。つまり、Piyoを書く処理とHogeを書く処理が同時に行われていることが分かります。

Piyo
Hoge
Hoge
Piyo
Hoge
Piyo
Hoge
Piyo
Piyo
Hoge
Piyo
Hoge

<バックグラウンドとフォアグラウンド>

Threadクラスは既定値でフォアグラウンドで実行されます。フォアグラウンドで実行された場合、メインスレッドが終了しても実行スレッドがあればそちらが終了するまでアプリケーションは待機します。逆にバックグラウンドで実行された場合は、メインスレッドが終了すると実行スレッドがあったとしても強制的にスレッドが終了してアプリケーションは終了します。

明示的にバックグラウンドで処理させる場合は、IsBackground プロパティをTrueに変更します。

testThread.IsBackground = true;
testThread.Start();

<スレッド終了の待機>

実行した別のスレッドの終了をメインスレッド内で待機する場合は、JoinメソッドをStartメソッドの後に追加します。

testThread.Start();
testThread.Join();


結果は以下の通りです。

Hoge
Hoge
Hoge
Hoge
Hoge
Hoge
Piyo
Piyo
Piyo
Piyo
Piyo
Piyo


ただ、スレッドの終了を待つのであれば別スレッドにする意味ないですけどね・・・。

sasaki816.hatenablog.com