惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

S
Secure Thoughts
S
Securelist
P
Proofpoint News Feed
D
DataBreaches.Net
Cisco Talos Blog
Cisco Talos Blog
C
CXSECURITY Database RSS Feed - CXSecurity.com
Project Zero
Project Zero
A
About on SuperTechFans
罗磊的独立博客
WordPress大学
WordPress大学
月光博客
月光博客
Latest news
Latest news
C
Cyber Attacks, Cyber Crime and Cyber Security
GbyAI
GbyAI
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
博客园 - 三生石上(FineUI控件)
F
Fortinet All Blogs
W
WeLiveSecurity
Attack and Defense Labs
Attack and Defense Labs
V
Visual Studio Blog
Blog — PlanetScale
Blog — PlanetScale
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
P
Privacy International News Feed
AI
AI
博客园 - 司徒正美
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
www.infosecurity-magazine.com
www.infosecurity-magazine.com
Stack Overflow Blog
Stack Overflow Blog
M
MIT News - Artificial intelligence
Help Net Security
Help Net Security
T
Tor Project blog
V
Vulnerabilities – Threatpost
C
Cisco Blogs
I
Intezer
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
MyScale Blog
MyScale Blog
雷峰网
雷峰网
MongoDB | Blog
MongoDB | Blog
Forbes - Security
Forbes - Security
V
V2EX
Apple Machine Learning Research
Apple Machine Learning Research
T
Threat Research - Cisco Blogs
B
Blog RSS Feed
博客园 - 叶小钗
N
News and Events Feed by Topic
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
Simon Willison's Weblog
Simon Willison's Weblog
C
CERT Recently Published Vulnerability Notes
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
N
News and Events Feed by Topic

博客园 - sashow

c++知识点--extern "C"的作用 - sashow - 博客园 粘贴一点有用的东西留存-- Control 类的事件顺序 开始→运行→输入命令集锦 c#的ThreadPool使用笔记(四)--实例:端口扫描程序 c#的ThreadPool使用笔记(三) c# 中Label 标签和.resx 文件中的换行问题 - sashow 计算某天是星期几的算法 find 和 grep 命令 - sashow Sql Server 中由数字转换为指定长度的字符串 [分享] C# 中 Socket 进行数据接收的一点心得 sql server 2005 使用问题总结 [转]解决无法显示所有文件和文件夹,无法显示隐藏文件和文件夹 FileStream进行Read() 操作后文件指针指向当前位置 用回车键模拟TAB键的方法 c#的ThreadPool使用笔记(二) 人民币大小写转换(C#) 放弃还是继续? 随便写点东西 [转贴]Informix SQL函数的详细用法
c#的ThreadPool使用笔记(一)
sashow · 2007-02-08 · via 博客园 - sashow

摘要:
系列文章,从一个基本的代码说起,逐步探索 ThreadPool 的奥妙。

首先,看看线程池的样子:

从上图看出,线程池维护1个至n个线程,操作系统从请求队列中提取请求分配个线程池中的适合线程处理。

先写下如下的代码:

using System;
using System.Threading;

public class ThreadBase
{
    
public static void Main ( ) {

        System.Threading.WaitCallback waitCallback 
= new WaitCallback ( MyThreadWork );

        ThreadPool.QueueUserWorkItem ( waitCallback, 
"第一个线程" );
        ThreadPool.QueueUserWorkItem ( waitCallback, 
"第二个线程" );
        ThreadPool.QueueUserWorkItem ( waitCallback, 
"第三个线程" );
        ThreadPool.QueueUserWorkItem ( waitCallback, 
"第四个线程" );
        Console.ReadLine ( );
    }


    
public static void MyThreadWork ( object state ) {
        Console.WriteLine ( 
"线程现在开始启动…… {0}",(string)state );
        Thread.Sleep ( 
10000 );
        Console.WriteLine ( 
"运行结束…… {0}",( string ) state );
    }

}

分析上面的代码:
一、首先定义了一个 System.Threading.WaitCallback 对象 waitCallback。
WaitCallback 是一个委托,表示线程池线程要执行的回调方法,它的原型如下:

[ComVisibleAttribute(true)] 
public delegate void WaitCallback (
    Object state
)

1、这里有一个 Callback 机制的问题,所谓的Callback 简单的理解就是由操作系统调用的函数,我们自己写的程序不需要调用。就像有个修理工到家里搞修理,你只需要告诉他钳子、螺丝刀、胶布等修理工具在什么地方就行,而不要管他在什么时候、在什么地方怎样使用这些修理工具。
2、WaitCallback 的参数" Object state",这个参数包含回调方法要使用的信息的对象。在接下来的情况中我再说。
既然 WaitCallback 委托的原型如此,那么我们就申明一个跟它的样子差不多的函数,这个函数就是要线程做的事情。

public static  void MyThreadWork ( object state )

这里函数中多了一个 "static",这是因为Main的关系(更大一点就是因为C#语言机制的问题),如果WaitCallback 的对象不是在静态(static)方法中,这个static 是不需要的。

二、接着就是要执行的方法放入线程池中,以便操作系统执行。
我这里放置了四个方法要操作系统执行:

        ThreadPool.QueueUserWorkItem ( waitCallback, "第一个线程" );
        ThreadPool.QueueUserWorkItem ( waitCallback, 
"第二个线程" );
        ThreadPool.QueueUserWorkItem ( waitCallback, 
"第三个线程" );
        ThreadPool.QueueUserWorkItem ( waitCallback, 
"第四个线程" );

这里,我放置到线程池中的操作是一样的,当然也可以不一样,接下来说。

三、最后阻塞主线程,等待线程池中的线程执行

 Console.ReadLine ( );

如果忽略掉这个代码,则有可能看不到任何输出

好了,这是主线程做的事情了,接下来看看线程池中的线程做的事情。
这个很简单,就是将线程的参数输出,然后线程睡眠(sleep)一段时间,最后输出线程结束的信息。