ThreadPool
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的更多相关文章
- ThreadPool.QueueUserWorkItem的用法
代码: ThreadPool.SetMaxThreads(, ); ThreadPool.QueueUserWorkItem((obj) => { MessageBox.Show("执 ...
- C# - 多线程 之 Process与Thread与ThreadPool
Process 进程类, // 提供对本地和远程进程的访问,启动/停止本地系统进程 public class Process : Component { public int Id { get; } ...
- C#多线程--线程池(ThreadPool)
先引入一下线程池的概念: 百度百科:线程池是一种多线程处理形式,处理过程中将任务添加到队列,然后在创建线程后自动启动这些任务.线程池线程都是后台线程.每个线程都使用默认的堆栈大小,以默认的优先级运行, ...
- mysql can't create threads in threadpool
最近,我们在券商端的mysql运行一段时间后,发生mysql can't create threads in threadpool,如下所示: 据官网一个报告显示,目测是一个bug,内存紧张导致,那天 ...
- Nodejs事件引擎libuv源码剖析之:高效线程池(threadpool)的实现
声明:本文为原创博文,转载请注明出处. Nodejs编程是全异步的,这就意味着我们不必每次都阻塞等待该次操作的结果,而事件完成(就绪)时会主动回调通知我们.在网络编程中,一般都是基于Reactor线程 ...
- C#中Thread与ThreadPool的比较
最近同事在编写一个基于UPD RTP协议的通信软件,在处理接收Listen时,发现了一个问题到底是用Thread还是ThreadPool呢? 我看同事的问题比较有典型性,还是做以整理培训一下吧 Thr ...
- python线程池(threadpool)模块使用笔记
一.安装与简介 pip install threadpool pool = ThreadPool(poolsize) requests = makeRequests(some_callable, li ...
- Thread and ThreadPool
C#中Thread与ThreadPool的比较 Thread类,一次使用一个线程,来创建和删除线程.这种方式建立和删除线程是很昂贵的(cpu密集型). Threadpool类 对于大多数的情况下是使用 ...
- 线程池ThreadPool知识碎片和使用经验速记
ThreadPool(线程池)大概的工作原理是,初始时线程池中创建了一些线程,当应用程序需要使用线程池中的线程进行工作,线程池将会分配一个线程,之后到来的请求,线程池都会尽量使用池中已有的这个线程进行 ...
- 多线程 ThreadPool线程池
简单说明一下: 线程池可以看做容纳线程的容器:一个应用程序最多只能有一个线程池:ThreadPool静态类通过QueueUserWorkItem()方法将工作函数排入线程池: 每排入一个工作函数,就相 ...
随机推荐
- [置顶] android调用第三方库——第四篇——调用多个第三方库
0:前言: 在前面三篇中我们介绍了android调用第三方库的形式,在这一篇中我们介绍调用多个第三方库的Android.mk的写法,由于其他三篇介绍的很详细,这里只给出Android.mk的内容. [ ...
- Love myself...
Sometimes we feel as if our lives rely on that one person. We think 'If I do this, he/she will like ...
- [转]iOS Assembly Tutorial: Understanding ARM
iOS Assembly Tutorial: Understanding ARM Do you speak assembly? When you write Objective-C code, it ...
- Leetcode::Pathsum & Pathsum II
Pathsum Description: Given a binary tree and a sum, determine if the tree has a root-to-leaf path su ...
- Linux下搭建Nginx+MySQL+PHP
在CentOS6.3下实践通过. 1.关闭防火墙 [root@CentOS ~]# chkconfig iptables off 2.关闭selinux vi /etc/sysconfig/selin ...
- 关于iOS UIScrollView放大的问题
总所周知 ,iOS 的UIScrollView是专门用来做缩放和分页用的,关于这方面的例子也很多了,但你们知道在放大的过程中 他做了些什么吗? 他的哪些东西会发生改变吗? 通过在一个项目中的小经历 ...
- 一,IL访问静态属性和字段
一,IL访问静态属性和字段 IL介绍 通用中间语言(Common Intermediate Language,简称CIL,发音为"sill"或"kill")是一 ...
- Javascript:再论Javascript的单线程机制 之 DOM渲染时机
Javascript:再论Javascript的单线程机制 之 DOM渲染时机 背景 Javascript是单线程事件驱动的,所有能看到的Javascript代码都是在一个线程执行,定时器回调和AJA ...
- [置顶] javascript-基于对象or面向对象?
最近完成了javascript的初级学习,在这个学习的视频中,我特别注意了两个词,解释性语言和对象,javascript按照我的理解,应该是种解释性语言,他有关于面向对象的思想的体现,但是,他和vb一 ...
- Servlet容器模型(四)ServletConfig、ServletContext
这两天刚刚回顾了一下servlet中的配置对象ServletConfig.上下文对象ServletContext.多线程相关的知识点,做了一下笔记,如下: 一.Servlet配置对象(ServletC ...