方法如何在ThreadPool上排队

时间:2012-07-25 18:16:32

标签: c# multithreading threadpool

我试图了解ThreadPool.QueueWorkItem方法的工作原理。但无法理解它是如何工作的。

我创建了一个测试ThreadPool的简单示例,当我运行此代码时,它会快速循环并停止在Thread.Sleep()行。那么ThreadPool在这里做了什么。它是否在内部集合中存储10000方法,然后异步执行它们。 (根据一些计算,内部线程计数可以是任何=>这是我所知道的)

  1. 如果有队列(应该是),我可以获取队列中等待的项目(方法)的计数吗?
  2. 2.在示例中,WriteLine方法很简单,但在我的实际应用中,我循环了50000个项目,并为数组中的每个项目调用Web服务方法,数据库选择/插入/更新vb ..是否可以做这种类型的事情?

    class Program
    {
        static void Main(string[] args)
        {
            new Program().Looper();
        }
    
        public void Looper()
        {
            for (int i = 0; i < 10000; i++)
            {
                ThreadPool.QueueUserWorkItem(WriteLine, i);
            }
    
            Thread.Sleep(10000);
        }
    
        public void WriteLine(object str)
        {
            Debug.WriteLine((int)str);
        }
    }
    

2 个答案:

答案 0 :(得分:2)

  

1)如果有队列(应该是),我可以得到队列中等待的项目(方法)的计数吗?

是的,有一个队列,没有你看不到它。这是ThreadPool的一个实现细节,无论如何你都无法用它做任何事情。

  

2.在示例中,WriteLine方法很简单,但在我的实际应用中,我循环了50000个项目,并为数组中的每个项目调用Web服务方法,数据库选择/插入/更新vb ..是否可以做这种类型的事情?

是的,听起来它可能是合并执行的一个很好的候选者,因为它涉及大量等待外部资源。也就是说,如果您使用的是.NET 4.0或更高版本,您可能需要查看TPL而不是自己访问线程池。 TPL为您提供了诸如任务嵌套和延续之类的功能,您无法使用ThreadPool。它还与Async模式本地集成,为您提供改进的异步I / O并行性。

答案 1 :(得分:0)

当你对一个项目进行排队时,增加一个int计数器,然后当进程完成执行时(我相信你可以有一个函数 - 当异步进程完成时委托执行),然后递减那个int计数器,那应该给你这个数字线程等待执行。 Thread.Sleep不存储任何内容,它只是暂停任何进一步的进程进入异步进程。