Thread.Join

Thread.Joinで、ワーカースレッドが終了するまで待つ。

Thread.Join メソッド (System.Threading) | Microsoft Docs

メインスレッドの方が先に終わってしまうような場合。

// 名前空間の登録
using System;           // 共通データ型と基本クラス(System名前空間)
using System.Threading; // マルチスレッド(System.Threading名前空間)

// MainClassの定義
class MainClass
{
    // Mainメソッドの定義
    static void Main()
    {

        // スレッドの生成.
        Thread thread = new Thread(new ThreadStart(ThreadFunc));    // Threadオブジェクトthreadを作成.(コンストラクタにはThreadStartデリゲートのコンストラクタ.さらにその引数にThreadFuncを渡す.)

        // スレッドの開始.
        thread.Start(); // thread.Startでスレッド開始.

        // "Main(1)~Main(3)"まで出力.
        for (int i = 1; i <= 3; i++)    // iが1から3まで繰り返す.
        {

            // "Main"とiを出力.
            Console.WriteLine("Main(" + i + ")"); // "Main(i)"を出力.

            // 1秒休止.
            Thread.Sleep(1000);    // Thread.Sleepで1000ミリ秒(1秒)休止.

        }

        // "Main Finished!"と出力.
        Console.WriteLine("Main Finished!"); // "Main Finished!"を出力.

    }

    // 生成したスレッドで実行するメソッドThreadFuncの定義
    static void ThreadFunc()
    {

        // "ThreadFunc(1)"~"ThreadFunc(5)"まで出力.
        for (int i = 1; i <= 5; i++)    // iが1から5まで繰り返す.
        {

            // "ThreadFunc"とiを出力.
            Console.WriteLine("ThreadFunc(" + i + ")"); // "ThreadFunc(i)"を出力.

            // 1秒休止.
            Thread.Sleep(1000);    // Thread.Sleepで1000ミリ秒(1秒)休止.

        }

    }

}

Mainの方が3回なので早く終わってしまう。

ThreadFunc(1)
Main(1)
ThreadFunc(2)
Main(2)
ThreadFunc(3)
Main(3)
ThreadFunc(4)
Main Finished!
ThreadFunc(5)
続行するには何かキーを押してください . . .

そこで、

thread.Joinで、終わるまで待つ。

ThreadFunc(1)
Main(1)
ThreadFunc(2)
Main(2)
ThreadFunc(3)
Main(3)
ThreadFunc(4)
ThreadFunc(5)
Main Finished!
続行するには何かキーを押してください . . .

Main Finished!が最後に来る。

Sample/dotnet/Thread/Join/src/Thread_ at master · bg1bgst333/Sample · GitHub