大家可以看到,在上面的例程中,同步是通过等待Monitor.Pulse()来完成的。首先生产者生产了一个值,而同一时刻消费者处于等待状态,直到收到生产者的“脉冲(Pulse)”通知它生产已经完成,此后消费者进入消费状态,而生产者开始等待消费者完成操作后将调用Monitor.Pulese()发出的“脉冲”。它的执行结果很简单:

  Produce: 1
  Consume: 1
  Produce: 2
  Consume: 2
  Produce: 3
  Consume: 3
  ...
  ...
  Produce: 20
  Consume: 20

  事实上,这个简单的例子已经帮助我们解决了多线程应用程序中可能出现的大问题,只要领悟了解决线程间冲突的基本方法,很容易把它应用到比较复杂的程序中去。

   四、线程池和定时器——多线程的自动管理
  在多线程的程序中,经常会出现两种情况。一种情况下,应用程序中的线程把大部分的时间花费在等待状态,等待某个事件发生,然后才能给予响应;而另外一种情况则是线程平常都处于休眠状态,只是周期性地被唤醒。在.net framework里边,我们使用ThreadPool来对付第一种情况,使用Timer来对付第二种情况。

  ThreadPool类提供一个由系统维护的线程池——可以看作一个线程的容器,该容器需要Windows 2000以上版本的系统支持,因为其中某些方法调用了只有高版本的Windows才有的API函数。你可以使用ThreadPool.QueueUserWorkItem()方法将线程安放在线程池里,该方法的原型如下:

  //将一个线程放进线程池,该线程的Start()方法将调用WaitCallback代理对象代表的函数
  public static bool QueueUserWorkItem(WaitCallback);
  //重载的方法如下,参数object将传递给WaitCallback所代表的方法
  public static bool QueueUserWorkItem(WaitCallback, object);

  要注意的是,ThreadPool类也是一个静态类,你不能也不必要生成它的对象,而且一旦使用该方法在线程池中添加了一个项目,那么该项目将是没有办法取消的。在这里你无需自己建立线程,只需把你要做的工作写成函数,然后作为参数传递给ThreadPool.QueueUserWorkItem()方法就行了,传递的方法就是依靠WaitCallback代理对象,而线程的建立、管理、运行等等工作都是由系统自动完成的,你无须考虑那些复杂的细节问题,线程池的优点也就在这里体现出来了,就好像你是公司老板——只需要安排工作,而不必亲自动手

C#的多线程机制探索7相关推荐

  1. C#的多线程机制探索1

    注:本文中出现的代码均在.net Framework RC3环境中运行通过 一.多线程的概念 Windows是一个多任务的系统,如果你使用的是windows 2000及其以上版本,你可以通过任务管理器 ...

  2. C#的多线程机制探索4

    expression代表你希望跟踪的对象,通常是对象引用.一般地,如果你想保护一个类的实例,你可以使用this:如果你希望保护一个静态变量(如互斥代码段在一个静态方法内部),一般使用类名就可以了.而s ...

  3. [ZT]C#的多线程机制探索(2)

    三.线程的同步和通讯--生产者和消费者 假设这样一种情况,两个线程同时维护一个队列,如果一个线程对队列中添加元素,而另外一个线程从队列中取用元素,那么我们称添加元素的线程为生产者,称取用元素的线程 ...

  4. C#的多线程机制探索3

    在这里我们要注意的是其它线程都是依附于Main()函数所在的线程的,Main()函数是C#程序的入口,起始线程可以称之为主线程,如果所有的前台线程都停止了,那么主线程可以终止,而所有的后台线程都将无条 ...

  5. C#的多线程机制探索6

    <!-- Please check block file --> 然后在下面这个类MonitorSample的Main()函数中我们要做的就是创建两个线程分别作为生产者和消费者,使用Cel ...

  6. C#的多线程机制探索5

    首先,我们定义一个被操作的对象的类Cell,在这个类里,有两个方法:ReadFromCell()和WriteToCell.消费者线程将调用ReadFromCell()读取cellContents的内容 ...

  7. C#的多线程机制探索2

    下面我们就动手来创建一个线程,使用Thread类创建线程时,只需提供线程入口即可.线程入口使程序知道该让这个线程干什么事,在C#中,线程入口是通过ThreadStart代理(delegate)来提供的 ...

  8. C#的多线程(2)——机制探索

    注:本文中出现的代码均在.net Framework RC3环境中运行通过 一.多线程的概念 Windows是一个多任务的系统,如果你使用的是windows 2000及 其以上版本,你可以通过任务管理 ...

  9. Java实用教程笔记 Java多线程机制

    Java多线程机制 泛型要考,后来又说不考了 多线程不考 12.1 进程与线程Process and Thread 12.2Java中的线程Threads in Java 线程的状态与生命周期The ...

最新文章

  1. 针对《评人工智能如何走向新阶段》一文,继续发布国内外的跟贴留言第二部557-561条如下
  2. 我成功攻击了Tomcat服务器,大佬们的反应亮了
  3. NBT:宏基因组二、三代混合组装软件OPERA-MS
  4. Win32汇编语言021 - 053
  5. python 除法取整_Python中整数和浮点数
  6. 结合代码详细聊聊 Java 网络编程中的 BIO、NIO 和 AIO
  7. springboot中端点监管 endpoint actuator
  8. php框架费尔康,GitHub - majixian/study-phalcon: phalcon(费尔康)框架学习笔记
  9. 3月12日见!红魔5G游戏手机正式官宣:全球首款144Hz游戏手机
  10. 95-140-134-源码-transform-KeyedStream的intervalJoin
  11. 关于vmvare网络连接方式的介绍与实践
  12. pvs、pvdisplay、pvscan 查看物理卷信息
  13. SolidWorks的发展历史(1994~2007)
  14. Linux下查看网络流量常用方法
  15. 分布式主动感知在智能运维中的实践
  16. 阿里云智能编码插件,更Cosy的开发体验
  17. RHEL 7 常用命令
  18. Spellman高压电源维修XRM50P50X3768电源维修PCM70N120X451
  19. linux编译blas,CBLAS编译安装与使用举例
  20. thinksns开源微博系统 V3上传漏洞

热门文章

  1. 数论 —— 佩尔方程与连分数
  2. 暑期训练日志----2018.8.11
  3. 10 CO配置-控制-成本中心会计-定义成本中心类别
  4. 3.7 SE11创建自建表-外键
  5. 邮件服务 php,PHP基础-邮件服务
  6. 文件md5码怎么生成_Linux 系统文件校验方法--MD5,SHA1,PGP,SHA256,SHA512
  7. 双目密集匹配的一般过程
  8. torchvision.datasets.ImageFolder使用详解
  9. 2-2hadoop概述
  10. 计算机课设容易挂吗,数学差的学生避开这4大专业,挂科是常态,每年都有学生不能毕业...