1.GetMaxThreads,GetMinThreads

    class Program
{
static void Main(string[] args)
{
int workerThreads;
int completePortsThreads;
ThreadPool.GetMaxThreads(out workerThreads, out completePortsThreads);
Console.WriteLine("线程池中最大的线程数{0},线程池中异步IO线程的最大数目{1}", workerThreads, completePortsThreads);
ThreadPool.GetMinThreads(out workerThreads, out completePortsThreads);
Console.WriteLine("线程池中最小的线程数{0},线程池中异步IO线程的最小数目{1}", workerThreads, completePortsThreads);
Console.Read();
}
}

线程不是越多越好
①:线程很多的话,线程调度就越频繁,可能就会出现某个任务执行的时间比线程调度花费的时间短很多的尴尬局面。
②:我们要知道一个线程默认占用1M的堆栈空间,如果10230个线程将会占用差不多10G的内存空间,我想普通的电脑立马罢工。

2.SetMaxTheads,SetMinThreads

    class Program
{
static void Main(string[] args)
{
int workerThreads;
int completePortsThreads;
ThreadPool.SetMaxThreads(, );
ThreadPool.SetMinThreads(, );
ThreadPool.GetMaxThreads(out workerThreads, out completePortsThreads);
Console.WriteLine("线程池中最大的线程数{0},线程池中异步IO线程的最大数目{1}\n", workerThreads, completePortsThreads);
ThreadPool.GetMinThreads(out workerThreads, out completePortsThreads);
Console.WriteLine("线程池中最小的线程数{0},线程池中异步IO线程的最小数目{1}\n", workerThreads, completePortsThreads);
Console.Read();
}
}

3.QueueUserWorkItem

需要容纳任务并执行的方法来了,该方法有一个WaitCallBack的委托,我们只需要把将要执行的任务丢给委托,CLR将会在线程池中调派空闲的线程执行。

    class Program
{
static void Main(string[] args)
{
ThreadPool.QueueUserWorkItem(Run1);
Console.Read();
} static void Run1(object obj)
{
Console.WriteLine("我是线程{0},我是线程池中的线程吗? \n回答:{1}", Thread.CurrentThread.ManagedThreadId, Thread.CurrentThread.IsThreadPoolThread);
}
}

可能我们也需要像普通的Thread一样带一些参数到工作线程中,QueueUserWorkItem的第二个重载版本解决了我们的问题。

    class Program
{
static void Main(string[] args)
{
ThreadPool.QueueUserWorkItem(Run1, "我是主线程");
Console.Read();
} static void Run1(object obj)
{
Console.WriteLine(obj);
}
}

4.RegisterWaitForSingleObject

我们知道,如果我们把要执行的任务丢给线程池后,相当于把自己的命运寄托在别人的手上。
①:我们再也不能控制线程的优先级了。
②:丢给线程池后,我们再也不能将要执行的任务取消了。

是的,给别人就要遵守别人的游戏规则,不过RegisterWaitForSingleObject提供了一些简单的线程间交互,因为该方法的第一个参数是
WaitHandle,在VS对象浏览器中,我们发现EventWaitHandle继承了WaitHandle,而ManualResetEvent和AutoResetEvent都继承于
EventWaitHandle,也就是说我们可以在RegisterWaitForSingleObject溶于信号量的概念。

    class Program
{
static void Main(string[] args)
{
AutoResetEvent ar = new AutoResetEvent(false);
ThreadPool.RegisterWaitForSingleObject(ar, Run1, null, Timeout.Infinite, false);
Console.WriteLine("时间:{0} 工作线程请注意,您需要等待5s才能执行。\n", DateTime.Now);
//5s
Thread.Sleep();
ar.Set();
Console.WriteLine("时间:{0} 工作线程已执行。\n", DateTime.Now);
Console.Read();
} static void Run1(object obj, bool sign)
{
Console.WriteLine("当前时间:{0} 我是线程{1}\n", DateTime.Now, Thread.CurrentThread.ManagedThreadId);
}
}

我们知道在Threading下面有一个Timer计时器,当定期触发任务的时候都是由线程池提供并给予执行,那么这里我们溶于信号量的概念以后同样可以实现计时器的功能。

    class Program
{
static void Main(string[] args)
{
AutoResetEvent ar = new AutoResetEvent(false);
//参数2000:其实就是WaitOne(2000),采取超时机制
ThreadPool.RegisterWaitForSingleObject(ar, Run1, null, , false);
Console.Read();
} static void Run1(object obj, bool sign)
{
Console.WriteLine("当前时间:{0} 我是线程{1}\n", DateTime.Now, Thread.CurrentThread.ManagedThreadId);
}
}

有时候,跑着跑着我们需要在某个时刻停止它,没关系,RegisterWaitForSingleObject返回一个RegisteredWaitHandle类,那么我们就通过RegisteredWaitHandle来动态的控制,比如说停止计数器的运行。

    class Program
{
static void Main(string[] args)
{
RegisteredWaitHandle handle = null;
AutoResetEvent ar = new AutoResetEvent(false);
//参数2000:其实就是WaitOne(2000),采取超时机制
handle = ThreadPool.RegisterWaitForSingleObject(ar, Run1, null, , false);
//10s
Thread.Sleep();
handle.Unregister(ar);
Console.WriteLine("干掉线程。");
Console.Read();
} static void Run1(object obj, bool sign)
{
Console.WriteLine("当前时间:{0} 我是线程{1}\n", DateTime.Now, Thread.CurrentThread.ManagedThreadId);
}
}

ThreadPool线程池的更多相关文章

  1. ThreadPool线程池 小结

    ThreadPool类提供一个线程池,该线程池可用于发送工作项.处理异步 I/O.代表其他线程等待以及处理计时器 线程池通过为应用程序提供一个由系统管理的辅助线程池使您可以更为有效地使用线程.一个线程 ...

  2. 转载【浅谈ThreadPool 线程池】

    浅谈ThreadPool 线程池 http://www.cnblogs.com/xugang/archive/2010/04/20/1716042.html

  3. 【多线程】-ThreadPool线程池

    ThreadPool介绍: Thread类是一个静态类,所有不存在实例化构造函数操作,直接可以调用其内所存在的方法. 微软官网给出的解释: 提供一个线程池,该线程池可用于执行任务.发送工作项.处理异步 ...

  4. .net 线程基础 ThreadPool 线程池

    1. ThreadPool 线程池异步: //public static bool QueueUserWorkItem(WaitCallback callBack); //public static ...

  5. 浅谈ThreadPool 线程池(引用)

    出自:http://www.cnblogs.com/xugang/archive/2010/04/20/1716042.html 浅谈ThreadPool 线程池 相关概念: 线程池可以看做容纳线程的 ...

  6. 多线程之旅(ThreadPool 线程池)

    一.什么是ThreadPool 线程池(源码) 1.线程池顾名思义,有我们的系统创建一个容器装载着我们的线程,由CLR控制的所有AppDomain共享.线程池可用于执行任务.发送工作项.处理异步 I/ ...

  7. 多线程 ThreadPool线程池

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

  8. Delphi ThreadPool 线程池(Delphi2009以上版本适用)

    http://blog.sina.com.cn/s/blog_6250a9df0101kref.html 在网上查找Delphi线程池,结果发现寥寥无几. 看了半天源代码,弄得一头雾水,觉得不容易理解 ...

  9. ThreadPool 线程池的作用

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

  10. 『Python』 ThreadPool 线程池模板

    Python 的 简单多线程实现 用 dummy 模块 一句话就可以搞定,但需要对线程,队列做进一步的操作,最好自己写个线程池类来实现. Code: # coding:utf-8 # version: ...

随机推荐

  1. 《超越C++标准库:Boost库导引》:序

    序(Foreword) C++社区正在发生着一些美妙的事情.尽管C++仍然是世界上使用最广泛的编程语言,它依旧在变得更加强大而且易用.不信么?容我慢慢道来. 当前版本的标准C++是在1998年最终确定 ...

  2. 获取本地计算机名和IP地址

    WSADATA wsadata; != WSAStartup(MAKEWORD(, ), &wsadata)) { AfxMessageBox("初始化网络环境失败!"); ...

  3. VS2015 发布常见问题

    1. 发布时预编译 所示如下: 遇到的问题 使用abp时引用了System.Collections.Immutable.dll,但是项目编译一直出错, 排查: 查看项目引用,可看到System.Col ...

  4. gPRC学习笔记

    gPRC学习笔记 gPRC基础教程. gPRC官方文档. protobuf 3.0的简易教程. 什么是RPC RPC(remote procedure call) -- 远程过程调用(相对于本地调用的 ...

  5. html5 - history 历史管理

    参考文章: w3c     :  http://www.w3.org/html/ig/zh/wiki/HTML5/history 张鑫旭  : http://www.zhangxinxu.com/wo ...

  6. Android Studio下载

    最新版本的Android Studio 2.1 RC下载地址: Windows: https://dl.google.com/dl/android/studio/ide-zips/2.1.0.8/an ...

  7. 10)django-ORM(创建,字段类型,字段参数)

    一:ORM关系对象映射(Object Relational Mapping,简称ORM) ORM分两种: DB first 先在数据库中创建数据库表等 Code first 先创建类,然后根据类创建数 ...

  8. Confluence 6 配置附件大小

    你可以限制上传到 Confluence 的附件的大小. 配置可以上传到 Confluence 的附件所允许的大小: 进入  > 基本配置(General Configuration). 选择 编 ...

  9. Confluence 6 数据库整合有关你数据库的大小写敏感问题

    'Collation' 是数据如何被存储和比较的规则.大小写是否敏感是有关字符集设置的一个方面.其他大小写敏感的方面有 kana (Japanese script)和宽度(单字节对比双字节长度). 设 ...

  10. Pod 找不到头文件 解决方法

    在 BuildSetting 中 搜索 User Header Search Paths 然后在下面 User Header Search Paths 中添加 ${SRCROOT}  再将后面参数改为 ...