简体   繁体   中英

Using c# QueueUserWorkItem doesn't seem to execute all the methods

Below is my code.

class Program
{
    static void Main(string[] args)
    {
        Console.WriteLine("Main thread starts and sleeps");
        Student stu = new Student();
        ThreadPool.QueueUserWorkItem(stu.Display, 7);
        ThreadPool.QueueUserWorkItem(stu.Display, 6);
        ThreadPool.QueueUserWorkItem(stu.Display, 5);
        Console.WriteLine("Main thread ends");
    }

}

public class Student
{
    public  void Display(object data)
    {
        Console.WriteLine(data);
    }
}

Every time I run the code, i get different results. I do not mean the order in which they are displayed.

Following are my various results

Main thread starts and sleeps  
Main thread ends


Main thread starts and sleeps
Main thread ends
7
5
6


Main thread starts and sleeps
Main thread ends
7

So, why don't i get all three numbers displayed every time. Please help.

That's because you are not waiting for the tasks to finish. They get queued to be executed on the thread pool, but the main thread exits before all or some of them have completed.

To see all of them finishing you need a synchronization barrier before the end of Main:

class Program
{
    static void Main(string[] args)
    {
        Console.WriteLine("Main thread starts and sleeps");
        Student stu = new Student();
        ThreadPool.QueueUserWorkItem(stu.Display, 7);
        ThreadPool.QueueUserWorkItem(stu.Display, 6);
        ThreadPool.QueueUserWorkItem(stu.Display, 5);

        // barrier here
        Console.WriteLine("Main thread ends");
    }
}

Unfortunately, C# does not have a built-in barrier for ThreadPool , so you will need to either implement one yourself, or use a different construct, like Parallel.Invoke .

ThreadPool threads are background threads , meaning they are aborted once your main thread ends. Since no one guarantees that your async methods will have a chance to execute before the last statement, you will get different results each time.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM