C# 需要了解.net线程池的帮助吗

C# 需要了解.net线程池的帮助吗,c#,multithreading,visual-studio-2010,threadpool,C#,Multithreading,Visual Studio 2010,Threadpool,我试图了解ThreadPool的功能,我有一个.NET示例: class Program { static void Main() { int c = 2; // Use AutoResetEvent for thread management AutoResetEvent[] arr = new AutoResetEvent[50]; for (int i = 0; i < arr.Length; ++

我试图了解ThreadPool的功能,我有一个.NET示例:

class Program
{
    static void Main()
    {
        int c = 2;

        // Use AutoResetEvent for thread management

        AutoResetEvent[] arr = new AutoResetEvent[50];

        for (int i = 0; i < arr.Length; ++i)
        {
            arr[i] = new AutoResetEvent(false);
        }

        // Set the number of minimum threads
        ThreadPool.SetMinThreads(c, 4);

        // Enqueue 50 work items that run the code in this delegate function
        for (int i = 0; i < arr.Length; i++)
        {
            ThreadPool.QueueUserWorkItem(delegate(object o)
            {
                Thread.Sleep(100);
                arr[(int)o].Set(); // Signals completion

            }, i);
        }

        // Wait for all tasks to complete
        WaitHandle.WaitAll(arr);
    }
}
类程序
{
静态void Main()
{
int c=2;
//使用AutoResteEvent进行线程管理
自动重置事件[]arr=新的自动重置事件[50];
对于(int i=0;i

这会运行50个“任务”,一组2个(
intc
)直到它们全部完成吗?或者我不了解它的真正功能。

如果您有时间,我建议您阅读以下内容:

<>这是一个很好的读法,它为基础从线程到并行编程奠定了基础。在尝试修改线程池代码之前,我建议您对前两章有一个基本的了解!)

通过设置最小线程数,您要求.NET运行时做的唯一一件事就是请为线程池分配至少2个线程。你并不是要求它将自身限制为2

因此,无法保证您的程序将为此使用多少线程。这取决于你的系统和许多其他因素

我做了一个简单的测试(对你的程序做了一些小改动,只跟踪同时进入睡眠调用的线程),在一次运行中最大值为4,在另一次运行中最大值为3,在另一次运行中最大值为7,在另一次运行中最大值为10,等等

您真的不需要更改线程池大小


您试图实现什么目标?

来自MSDN文档中的:

当需求较低时,实际数量 线程池中的线程数可能低于 最小值

因此,您指定的值不能保证2个工作线程将在队列项目上工作。它可以是1个工作线程(因为您正在循环中排队,它可能在下一个工作线程排队之前完成),或者它可以根据系统资源和必须完成的工作量使用更多的工作线程

如果你真的想看看发生了什么,看看像这样的工具。您可以监视进程的线程创建,并跟踪它们的创建、销毁等时间。这将真正帮助您了解应用程序(以及底层框架)正在做什么


希望这有帮助。

背景:.NET线程池管理线程的常规方法可能会很麻烦。它可以很好地限制由资源争用引起的问题,但这样做的代价是线程的创建速度。为了通过线程池提高辅助线程的性能,设计人员允许使用一种机制,允许在不经过队列进程的情况下创建一定数量的线程

SetMinThreads()指定只应“按需”创建的线程数,也就是说,只需在不检查当前线程数或排队以缓慢加速的情况下启动即可

将要发生的是,框架将立即创建前两个线程,就像您手动设置它们并使用Thread.Start将它们踢出一样。除此之外,在当前MaxThreads计数之前,框架将开始对工作线程的请求排队,并以指定的间隔启动它们(默认情况下,250ms,我相信这也可以配置),以避免资源冲突。原因是,如果您想象一个循环行为,即启动一个访问资源的线程,进行一些计算,然后将结果写到其他地方,您可以看到5个线程几乎同时启动会导致试图访问第一个资源的logjam。在MaxThreads阈值处,队列停止;在一个线程完成之前,不会创建新线程


因此,根据代码的性质,将安排50个单独的辅助任务,但并非所有50个任务都将同时运行;运行时将允许两个立即启动,然后等待250ms或直到其中一个结束,然后启动下一个。因为线程将在不到250ms的时间内执行和终止,所以您不太可能看到同时执行2个以上的工作线程;创建第三个线程之前的等待将永远不会发生,因为“不受限制”的工作线程将首先释放,等待的线程在等待时间到期之前被启动,然后时钟将用下一个线程重置。

,您是否尝试运行它并观察发生了什么?这难道不能很好地解释SetMinThreads应该做什么。。。在一天结束时,实际运行的线程数量将取决于可用的系统资源,这些资源在每次运行时都可能发生变化。这是一个很好的链接,也是一个很好的关于线程运行情况的资源。我完全忘了提那件事。很好+1在过去的3天里,我一直在反复阅读,试图实现它!我们创建了一个多线程服务来处理非常特定的请求,他的等待和脉冲模式解释是非常宝贵的。对我们来说,我们的投票服务正受到周期性投票之间大量耗时的背景工作的影响。我甚至没有读到第4章,只是在后台工作人员(.NET3.5)和锁中使用EAP模式。我还没有足够的信心在这个阶段做更多的事情!但是,是的,简明扼要的解释。在多次尝试之后,我真的开始理解线程。