我试图了解ThreadPool.QueueWorkItem方法的工作原理。但无法理解它是如何工作的。
我创建了一个测试ThreadPool的简单示例,当我运行此代码时,它会快速循环并停止在Thread.Sleep()行。那么ThreadPool在这里做了什么。它是否在内部集合中存储10000方法,然后异步执行它们。 (根据一些计算,内部线程计数可以是任何=>这是我所知道的)
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);
}
}
答案 0 :(得分:2)
1)如果有队列(应该是),我可以得到队列中等待的项目(方法)的计数吗?
是的,有一个队列,没有你看不到它。这是ThreadPool的一个实现细节,无论如何你都无法用它做任何事情。
2.在示例中,WriteLine方法很简单,但在我的实际应用中,我循环了50000个项目,并为数组中的每个项目调用Web服务方法,数据库选择/插入/更新vb ..是否可以做这种类型的事情?
是的,听起来它可能是合并执行的一个很好的候选者,因为它涉及大量等待外部资源。也就是说,如果您使用的是.NET 4.0或更高版本,您可能需要查看TPL而不是自己访问线程池。 TPL为您提供了诸如任务嵌套和延续之类的功能,您无法使用ThreadPool。它还与Async模式本地集成,为您提供改进的异步I / O并行性。
答案 1 :(得分:0)
当你对一个项目进行排队时,增加一个int计数器,然后当进程完成执行时(我相信你可以有一个函数 - 当异步进程完成时委托执行),然后递减那个int计数器,那应该给你这个数字线程等待执行。 Thread.Sleep不存储任何内容,它只是暂停任何进一步的进程进入异步进程。