Web検索はbingがおすすめ!

メインスレッドの実行をブロックしてスレッドの終了を待つ - C#

メインスレッドの実行をブロックしてスレッドの終了を待つコードを紹介します。

概要

メインスレッドの実行をブロックしてスレッドの終了を待つときにはJoin()メソッドを利用します。

プログラム例

下記のプログラムを作成します。

UI

Windows Formアプリケーションを作成し、下図のUIを作成します。

コード

下記のコードを記述します。
FormMain.cs
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Threading;

namespace WaitThreadTerminate
{
  public partial class Form1 : Form
  {
    public Form1()
    {
      InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e)
    {
      MyThread m = new MyThread();                      //スレッドクラスの作成
      Thread t = new Thread(new ThreadStart(m.exec));
      t.Start();                                        //スレッド実行

      t.Join();
      System.IO.StreamReader sr = new System.IO.StreamReader("out.txt");
      textBox1.Text += sr.ReadLine() +"\r\n";
      sr.Close();
      textBox1.Text += "End";
    }
  }
}
MyThread.cs
namespace WaitThreadTerminate
{
  class MyThread
  {
    public void exec()
    {
      System.Threading.Thread.Sleep(10000);

      System.IO.StreamWriter sw = new System.IO.StreamWriter("out.txt");
      sw.WriteLine("処理が終わりました。");
      sw.Close();
    }
  }
}

解説

フォームのボタンをクリックすると スレッドを作成し、MyThreadクラスのexecメソッドを実行します。スレッドの作成と実行の詳細はこちらの記事を参照してください。サブスレッドのexecメソッドでは10秒間停止し、その後 out.txt ファイルに"処理が終わりました。"の文字列を書き込みます。
フォームのメインスレッドは、Join メソッドによりスレッドの実行完了を待った後、out.txt ファイルを開きファイルの内容を読み込みテキストボックスに表示します。スレッドで書き込まれた"処理が終わりました。"の文字列がテキストボックスに表示されます。

実行結果

プログラムを実行します。下図のウィンドウが表示されます。[button1]をクリックします。

ボタンのクリックから約10秒経過後にテキストボックスに、"処理が終わりました。"と"End"の文字列が表示されます。


著者
iPentecのメインプログラマー
C#, ASP.NET の開発がメイン、少し前まではDelphiを愛用
掲載日: 2010-05-28
iPentec all rights reserverd.