C# 方法如何在线程池上排队

C# 方法如何在线程池上排队,c#,multithreading,threadpool,C#,Multithreading,Threadpool,我试图了解ThreadPool.QueueWorkItem方法是如何工作的。但我无法理解它是如何工作的 我创建了一个简单的示例来测试ThreadPool,当我运行这段代码时,它会快速循环并停止在Thread.Sleep()行。那么ThreadPool在这里做什么呢。它是否将10000方法存储在内部集合中,然后异步执行它们。(根据一些计算,线程计数可以是任何东西=>这就是我所知道的) 如果有一个队列(应该是),我可以得到队列上等待的项(方法)的计数吗 2.在示例中,WriteLine方法很简单,但

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

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

  • 如果有一个队列(应该是),我可以得到队列上等待的项(方法)的计数吗
  • 2.在示例中,WriteLine方法很简单,但在我的实际应用程序中,我循环了50000个项目,并调用web服务方法database select/insert/update 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);
        }
    }
    
    类程序
    {
    静态void Main(字符串[]参数)
    {
    新程序().Looper();
    }
    公共无效循环器()
    {
    对于(int i=0;i<10000;i++)
    {
    QueueUserWorkItem(WriteLine,i);
    }
    睡眠(10000);
    }
    公共无效写入线(对象str)
    {
    Debug.WriteLine((int)str);
    }
    }
    
    当您对一个项目进行排队时,增加一个int计数器,然后当进程完成执行时(我相信您可以在异步进程完成时执行一个函数-delegate),然后减少该int计数器,这将为您提供等待执行的线程数。Sleep不存储任何内容,它只是阻止任何进一步的进程进入该异步进程

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

    是的,有一个队列,不,你看不到它。这是ThreadPool的一个实现细节,无论如何,您都无法真正使用它

    2.在示例中,WriteLine方法很简单,但在我的实际应用程序中,我循环了50000个项目,并调用web服务方法database select/insert/update 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);
        }
    }
    

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

    您是如何得到一个50k方法数组的?我从来没有用真正的方法体测试过它