1

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

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

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

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);
    }
}
4

2 回答 2

2

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

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

2.在示例中,WriteLine 方法很简单,但在我的实际应用中,我正在循环超过 50000 个项目并为数组中的每个项目调用 Web 服务方法、数据库选择/插入/更新 vb..。有可能做这样的事情吗?

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

于 2012-07-25T18:20:41.263 回答
0

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

于 2012-07-25T18:20:25.787 回答