ナルシーNote

2020年12月からC#、2021年2月からPythonを51歳で始めました。学んだことを備忘録として残してます。そろそろN88BASICは卒業しようかな😱

<C#>スレッドが終了するまで待つ

スレッドの終了の待ち方を3種類試してみました。

Application.DoEvents()は使わないほうが良いと書いてあるページが多いのですが、フォームが固まってしまってダメです。

とりあえずApplication.DoEvents()を使っちゃえ(笑)

(1)Task.WaitAll() メソッドでスレッドが終了するのを待つ

// ↓フォームが固まる
Console.WriteLine("(1)開始:" + DateTime.Now.ToString("HH:mm:ss"));
Task th1 = Task.Factory.StartNew(() => Thread1());
Task th2 = Task.Factory.StartNew(() => Thread2());
Task.WaitAll(th1, th2);
Console.WriteLine("(1)終了:" + DateTime.Now.ToString("HH:mm:ss"));

(2)Thread.Join() メソッドでスレッドが終了するのを待つ

// ↓フォームが固まる
Console.WriteLine("(2)開始:" + DateTime.Now.ToString("HH:mm:ss"));
Thread th3 = new Thread(new ThreadStart(Thread2));
th3.Start();
th3.Join();
Console.WriteLine("(2)終了:" + DateTime.Now.ToString("HH:mm:ss"));

(3)th4.IsAliveでスレッドが終了するのを待つ

// ↓フォームは固まらない
Console.WriteLine("(3)開始:" + DateTime.Now.ToString("HH:mm:ss"));
Thread th4 = new Thread(new ThreadStart(Thread2));
th4.Start();
while (th4.IsAlive)
{
    Application.DoEvents();
}
Console.WriteLine("(3)終了:" + DateTime.Now.ToString("HH:mm:ss"));

 

Thread1とThread2は、とりあえずこんな感じ。

private void Thread1()
{
    Thread.Sleep(5000);
}

private void Thread2()
{
    Thread.Sleep(6000);
}

 

ご使用に関しては自己責任でよろしくお願い申し上げます。

2020年12月にpaizaラーニングでC#を受講しました。

コメントでアドバイスをいただけると幸いです。

 

ほしい物リスト

ナルシーのほしい物リストはこちら