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()方法将工作函数排入线程池: 每排入一个工作函数,就相 ...
随机推荐
- JavaScript闭包小窥
众所周知,JavaScript没有块级作用域,只有函数作用域.那就意味着定义在函数中的参数和变量在函数外部是不可见的,而在一个函数内部任何位置定义的变量,在该函数内部任何地方都可见.这带来的好处是内部 ...
- DesignMode的状态处理
自定义控件开发的调试及DesignMode的状态处理 在开发Winform程序的时候,我们往往需要根据需要做一些自定义的控件模块,这样可以给系统模块重复利用,或者实现更好的效果等功能.但在使用的时候, ...
- Winform 程序嵌入WPF程序 并发送消息
废话不多说,先看解决方案目录 WindowsFormsDemo是主程序,WpfApp是嵌入的WPF程序,先看WPF程序,程序默认启动的页面是MainWindow.xaml,这里注释掉App.xaml里 ...
- Hadoop 使用FileSystem API 读取数据
代码: package com.hadoop; import java.io.IOException; import java.io.InputStream; import java.net.URI; ...
- Nginx+Tomcat+Memcached实现tomcat集群和session共享
一.Nginx安装 详见前文:http://www.cnblogs.com/yixiwenwen/p/3574097.html 二.memcached安装和启动 详见前文:http://www.cnb ...
- jQuery选择表格中的列
以选择table中的第一列为例: 方式1: $("table tr").find("td:first").html("first column&quo ...
- Paint与Canvas的简单用法
参考:http://www.eoeandroid.com/forum.php?mod=viewthread&tid=278237 自定义View 重写onDraw方法 package com. ...
- ASP.NET交互Rest服务接口(Jquery的Get与Post方式)
ASP.NET交互Rest服务接口(Jquery的Get与Post方式) 本文将通过一个简单的实例,介绍如何创建一个Rest服务接口,以及通过JQUERY去对它进行调用;主要采取两种方式分别为Get跟 ...
- [转]The Best Plugins for Sublime Text
Source: http://ipestov.com/the-best-plugins-for-sublime-text/ Good day, everyone! I tried to collect ...
- [原]调试没有符号的 iOS 应用
说明: 这里的调试是指使用 lldb 远程调试 iOS 应用 设置断点是指在 ObjC 方法上设置断点 使用场景: 1.调试被 strip 了的 iOS 应用 2.调试被 strip 了的 iOS 系 ...