اجرای یک Thread پس از اتمام Thread دیگر

فرض کنید 3 نخ(Thread) داریم که با هم شروع بکار میکنند اما میخوایم Thread سوم پس از اتمام دو Thread اول شروع به کار کنه. بنظر شما برای انجامش از چه تکنیکی میشه استفاده کرد؟!
ThreadPool؟ Semaphore؟ AutoResetEvents؟! برای پاسخش مجبور شدم دوباره همه این ها رو مطالعه کنم تا ببینم به کارم میان یا نه!
run-one-thread-after-completing-another-thread-csharp
اما پاسخ خیلی راحت تر بود!  استفاده از متد Join در Thread:

Thread t1, t2, t3;
int data1, data2;
void Main()
{
    t1 = new Thread(() =>
    {
        //do some stuffs...
        //sleep the thread for 3 seconds
        Thread.Sleep(3000);
        data1 = 10;
    });
    t2 = new Thread(() =>
    {
        //do some stuffs...
        Thread.Sleep(2000);
        data2 = 20;
    });
    t3 = new Thread(() =>
    {
        t1.Join(); //t3 will wait in this line until t1 done.
        t2.Join(); //t3 will wait in this line until t2 done.
        //now do stuffs in t3:
        Console.WriteLine("result:" + (data1 * data2)); //prints "result:200" in output
    });
    t1.Start();
    t2.Start();
    t3.Start();
}

متد Join باعث میشه نخ جاری تا زمانی که نخی که متد Join اون صدا زده شده به اتمام نرسیده متوقف بشه. بعبارت ساده تر، t3 در خط t1.Join منتظر میمونه تا اجرای t1 به اتمام برسه بعد به خط بعد میره (t2.Join) و در انتها زمانی که اجرای t2 تموم شد، t3 به کار خودش ادامه میده (در اینجا چاپ خروجی)