为什么这个C#ThreadPool有时会丢弃工作项?

时间:2012-05-04 13:54:14

标签: c# .net threadpool

class Program
{
    private int x = 0;
    static void Main(string[] args)
    {

        Program p = new Program();
        int a, b;
        ThreadPool.GetMaxThreads(out a, out b);
        Console.WriteLine("{0} - {1}", a, b);
        for (int y = 0; y < 20; y++)
        {
            WaitCallback cb = new WaitCallback(DoSomething);

            ThreadPool.QueueUserWorkItem(cb, y);
        }
    }

    public static void DoSomething(object state)
    {
        Console.WriteLine(state);
    }
}

大部分时间它打印出20个项目。但是,有时它只打印一些。这是为什么?我来自Java背景,我想知道我是否对.NET ThreadPools如何工作做出了一些错误的假设。

2 个答案:

答案 0 :(得分:7)

ThreadPool没问题,它不会丢弃任何东西。

在输出完成之前,您的程序很可能会关闭 ThreadPool使用后台线程,并在进程退出时简单地中止它们。

所以添加等待的东西,比如Main的末尾的Console.ReadLine(),看看会发生什么。

答案 1 :(得分:0)

在所有线程完成各自的任务之前,没有什么可以阻止程序继续。循环之后,您将要阻止主线程,直到所有回调都被触发。