private void button6_Click(object sender, EventArgs e)
        {
            ThreadPool.SetMinThreads(, );
            ThreadPool.SetMaxThreads(, );
            //可以用ManualResetEvent控制
            //var ehs = new List<ManualResetEvent>();
            ; i < ; i++)
            {
                //var m = new ManualResetEvent(false);
                //m.Add(m);
                //可以封装到类,也可直接传索引
                ThreadHelper th = new ThreadHelper();
                th.id = i;
                //也可以原子
                //Interlocked.Increment(ref i);
                ThreadPool.QueueUserWorkItem(new WaitCallback(work3), th);
                ThreadPool.QueueUserWorkItem(h =>
                {
                    work3(th);
                    //m.Set();
                });
            }
            ////第一种方式等待
            //WaitHandle.WaitAll(ehs.ToArray());
            ////第二种方式等待
            //foreach (var m in ehs)
            //{
            //    m.WaitOne();
            //}
            while (!CheckThreadPool())
            { Application.DoEvents(); }
            MessageBox.Show("投递~~~~~");
        }

        /// <summary>
        /// 取是否空闲
        /// </summary>
        /// <returns></returns>
        private bool CheckThreadPool()
        {
            ;
            ;
            ;
            ThreadPool.GetAvailableThreads(out workerThreads, out compleThreads);
            ThreadPool.GetMaxThreads(out maxWordThreads, out compleThreads);
            //当可用的线数与池程池最大的线程相等时表示线程池中所有的线程已经完成
            if (workerThreads == maxWordThreads)
            {
                //当执行此方法后CheckThreadPool将不再执行
                return true;
                //此处加入所有线程完成后的处理代码
            }
            return false;
        }
        /// <summary>
        /// 取是否空闲
        /// </summary>
        /// <returns></returns>
        private bool GetWhetherIdle()
        {
            int MaxWorkerThreads, miot, AvailableWorkerThreads, aiot;

            //获得最大的线程数量
            ThreadPool.GetMaxThreads(out MaxWorkerThreads, out miot);

            AvailableWorkerThreads = aiot = ;

            //获得可用的线程数量
            ThreadPool.GetAvailableThreads(out AvailableWorkerThreads, out aiot);

            //返回线程池中活动的线程数
            return MaxWorkerThreads == AvailableWorkerThreads;
        }
        /// <summary>
        /// 取空闲线程数
        /// </summary>
        /// <returns></returns>
        private int GetIdle()
        {
            int MaxWorkerThreads, miot, AvailableWorkerThreads, aiot, threadcount;

            //获得最大的线程数量
            ThreadPool.GetMaxThreads(out MaxWorkerThreads, out miot);

            AvailableWorkerThreads = aiot = ;

            //获得可用的线程数量
            ThreadPool.GetAvailableThreads(out AvailableWorkerThreads, out aiot);

            //取线程池线程数
            ThreadPool.GetMinThreads(out threadcount, out threadcount);
            //返回线程池中活动的线程数
            return threadcount - (MaxWorkerThreads - AvailableWorkerThreads);
        }
        private void work3(object task)
        {

            //可以封装到类,也可直接传索引
            ThreadHelper task2 = task as ThreadHelper;
            this.Invoke(new MethodInvoker(delegate
            {
                textBox1.AppendText(task2.id.ToString() + "\r\n");
            }));
            Thread.Sleep();
        }

ThreadPool的更多相关文章

  1. ThreadPool.QueueUserWorkItem的用法

    代码: ThreadPool.SetMaxThreads(, ); ThreadPool.QueueUserWorkItem((obj) => { MessageBox.Show("执 ...

  2. C# - 多线程 之 Process与Thread与ThreadPool

    Process 进程类, // 提供对本地和远程进程的访问,启动/停止本地系统进程 public class Process : Component { public int Id { get; } ...

  3. C#多线程--线程池(ThreadPool)

    先引入一下线程池的概念: 百度百科:线程池是一种多线程处理形式,处理过程中将任务添加到队列,然后在创建线程后自动启动这些任务.线程池线程都是后台线程.每个线程都使用默认的堆栈大小,以默认的优先级运行, ...

  4. mysql can't create threads in threadpool

    最近,我们在券商端的mysql运行一段时间后,发生mysql can't create threads in threadpool,如下所示: 据官网一个报告显示,目测是一个bug,内存紧张导致,那天 ...

  5. Nodejs事件引擎libuv源码剖析之:高效线程池(threadpool)的实现

    声明:本文为原创博文,转载请注明出处. Nodejs编程是全异步的,这就意味着我们不必每次都阻塞等待该次操作的结果,而事件完成(就绪)时会主动回调通知我们.在网络编程中,一般都是基于Reactor线程 ...

  6. C#中Thread与ThreadPool的比较

    最近同事在编写一个基于UPD RTP协议的通信软件,在处理接收Listen时,发现了一个问题到底是用Thread还是ThreadPool呢? 我看同事的问题比较有典型性,还是做以整理培训一下吧 Thr ...

  7. python线程池(threadpool)模块使用笔记

    一.安装与简介 pip install threadpool pool = ThreadPool(poolsize) requests = makeRequests(some_callable, li ...

  8. Thread and ThreadPool

    C#中Thread与ThreadPool的比较 Thread类,一次使用一个线程,来创建和删除线程.这种方式建立和删除线程是很昂贵的(cpu密集型). Threadpool类 对于大多数的情况下是使用 ...

  9. 线程池ThreadPool知识碎片和使用经验速记

    ThreadPool(线程池)大概的工作原理是,初始时线程池中创建了一些线程,当应用程序需要使用线程池中的线程进行工作,线程池将会分配一个线程,之后到来的请求,线程池都会尽量使用池中已有的这个线程进行 ...

  10. 多线程 ThreadPool线程池

    简单说明一下: 线程池可以看做容纳线程的容器:一个应用程序最多只能有一个线程池:ThreadPool静态类通过QueueUserWorkItem()方法将工作函数排入线程池: 每排入一个工作函数,就相 ...

随机推荐

  1. springmvc的一些记录

    1.springmvc基本配置 2.springmvc+hibernate4配置 3.springmvc+hibernate4+freemarker配置 4.springmvc+hibernate4+ ...

  2. [置顶] Hibernate从入门到精通(十)多对多单向关联映射

    上一篇文章Hibernate从入门到精通(九)一对多双向关联映射中我们讲解了一下关于一对多关联映射的相关内容,这次我们继续多对多单向关联映射. 多对多单向关联映射 在讲解多对多单向关联映射之前,首先看 ...

  3. JavaScript module pattern精髓

    JavaScript module pattern精髓 avaScript module pattern是一种常见的javascript编码模式.这种模式本身很好理解,但是有很多高级用法还没有得到大家 ...

  4. 2013.4.A

    =-=最近简直忙疯了.....两眼泪汪汪的...一个星期又磨磨蹭蹭的刷了一套 1.java_c 题1 Java vs C++ [问题描述] Java和C++两种语言的辩手都可以相互争论数小时去证明他们 ...

  5. inet_aton()

    两次技术面试都被让c语言实现inet_aton()函数 看来这个函数真的很重要. 我先贴上我自己的实现代码 #include <stdio.h> #include <math.h&g ...

  6. jQuery跳房子插件hopscotch

    插件描述 跳房子是一个框架,使开发人员可以轻松预览产品并添加到他们的网页 跳房子接受JSON对象作为输入,并提供开发人员来控制渲染巡演显示和管理的游览进度的API. 使用步骤 要使用跳房子框架上手,只 ...

  7. jQuery Validation让验证变得如此容易(一)

    一.官网下载jquery,和jquery validation plugin http://jqueryvalidation.org/ 二.引入文件 <script src="js/j ...

  8. ul和li实现分两列(多列)布局显示

    简单语句实现DIV+CSS分两列(多列)布局显示 <style type="text/css"> .my ul { width: 210px; } .my li { w ...

  9. js中getByClass()函数

    js中getByClass()函数进化史 对于js来说,我想每一个刚接触它的人都应该会抱怨:为什么没有一个通过class来获取元素的方法.尽管现在高版本的浏览器已经支持getElementsByCla ...

  10. Eclipse RCP /Plugin移除Search对话框

    RCP:如何移除Search对话框中不需要的项 2013-08-18 22:31 by Binhua Liu, 231 阅读, 0 评论, 收藏, 编辑 前言 很久没写文章了,准备写一系列关于Ecli ...