15.7. Waiting for Worker Thread Completion

Problem

You have two threads currently running in your application. You need the main thread to wait until the worker thread has completed its processing. This ability comes in handy when your application is monitoring activities amongst multiple threads and you don’t want your main application thread to terminate until all of the workers are done processing.

Solution

Use the Thread.Join method to detect when a thread terminates:

class Worker
{
    static void Main( )
    {
        Run( );
    }

    static void Run( )
    {
        Thread worker = new Thread(new ThreadStart(WorkerThreadProc));
        worker.Start( );
        if(worker.Join(4000))
        {
            // worker thread ended ok
            Console.WriteLine("Worker Thread finished");
        }
        else
        {
            // timed out
            Console.WriteLine("Worker Thread timed out");
        }
    }

    static void WorkerThreadProc( )
    {
        Thread.Sleep(2000);
    }
}

Discussion

In the Worker class shown previously, the Run method starts off running in the context of the main thread. It then launches a worker thread; it then calls Join on it with a timeout set to four seconds. Since we know that the worker thread should not run for more than two seconds (see WorkerThreadProc), this should be sufficient time to see the worker thread terminate and for the main thread to finish and terminate in an orderly fashion.

It is very important to call Join only after the worker thread has been started, or you will get a ThreadStateException .

See Also

See the “Thread.Join Method” topic in the MSDN documentation.

Get C# Cookbook now with the O’Reilly learning platform.

O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.