随笔分类 - C#线程系列
摘要:在上一讲介绍了使用lock来实现线程之间的同步。实际上,这个lock是C#的一个障眼法,在C#编译器编译lock语句时,将其编译成了调用Monitor类。先看看下面的C#源代码:Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/-->publicstaticvoidMyLock(){lock(typeof(Program)){}} 上面的代码通过lock语句使MyLock同步,这个方法被编译成IL后,代码如图1所示。 图1 从上图被标注的区域可以看到
阅读全文
摘要:如果设计一个服务器程序,每当处理用户请求时,都开始一个线程,将会在一定程序上消耗服务器的资源。为此,一个最好的解决方法就是在服务器启动之前,事先创建一些线程对象,然后,当处理客户端请求时,就从这些建好的线程中获得线程对象,并处理请求。保存这些线程对象的结构就叫做线程池。 在C#中可以通过System.Threading.ThreadPool类来实现,在默认情况下,ThreadPool最大可建立500个工作线程和1000个I/O线程(根据机器CPU个数和.net framework版本的不同,这些数据可能会有变化)。下面是一个用C#从线程池获得线程的例子:Code highlighting pr
阅读全文
摘要:首先弄清楚, ManualResetEvent 是WaitEventHandler(等待事件句柄)的一个子类。 ManualResetEvent 允许线程通过发信号互相通信。通常,此通信涉及一个线程在其他线程进行之前必须完成的任务。 可以通过将布尔值传递给构造函数来控制 ManualResetEvent 的初始状态,如果初始状态处于终止状态,为 true;否则为 false。 关于Set()/ReSet()/WaitOne()ReSet():将 ManualResetEvent 事件设置为非终止状态,即:保持等待。导致其他线程阻塞。或这样理解:reset()方法就是为waitone()准备的.
阅读全文