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