【C#】ManualResetEvent ~スレッド呼び出し元をブロックするには~

■ メソッド

ManualResetEvent.WaitOneメソッド

 * スレッドをブロック
 * ManualResetEvent.Setメソッドを呼び出すまで待機

ManualResetEvent.Setメソッド

 * 指定したイベントの状態をシグナル状態に設定

■ サンプル

// 非シグナル状態でManualResetEventオブジェクトを作成
ManualResetEvent manualEvent = new ManualResetEvent(false);

private void button1_Click(object sender, EventArgs e)
{
    // スレッドを作成し、開始する
    Thread thread = new Thread(this.ThreadProccess);
    thread.Start();
}

private void button2_Click(object sender, EventArgs e)
{
    // シグナル状態にする
    this.manualEvent.Set();
}

// 別スレッドで実行するメソッド
private void ThreadProccess()
{
    for (int i = 0; i < 10; i++)
    {
        // シグナル状態になるまでスレッドをブロックする
        this.manualEvent.WaitOne();
        // 非シグナル状態にする
        this.manualEvent.Reset();
        // InvokeでFrom上のListBoxに表示させる
        this.Invoke(new MethodInvoker(
            delegate
            {
                this.listBox1.Items.Add(i.ToString());
            }));
    }
}