《C#高级编程第七版》多线程之Events

按照范例,将代码稍加变动,打出来了,如下所示

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
using System.Text;

namespace Demo2
{
    class Program
    {
        static void Main(string[] args)
        {
            const int taskcount = 10;

            //事件数组,记录线程执行状态
            var mevents = new ManualResetEventSlim[taskcount];

            //等待数组,接收事件发出的信号
            var waithandles = new WaitHandle[taskcount];

            //执行具体任务的类
            var calcs = new Calculator[taskcount];

            //任务工厂
            TaskFactory tf = new TaskFactory();

            for (int i = 0; i < taskcount; i++)
            {
                //初始化事件
                mevents[i] = new ManualResetEventSlim(false);

                //将事件与等待绑定
                waithandles[i] = mevents[i].WaitHandle;

                //初始化执行具体任务的类
                calcs[i] = new Calculator(mevents[i]);

                //开始一个任务
                tf.StartNew(calcs[i].Calculation, Tuple.Create(i + 1, i + 3));
            }

            //Thread.Sleep(5000);
            Console.Write("task is running\r\n");

            for (int i = 0; i < taskcount; i++)
            {
                //返回执行完操作的等待数组的索引,根据索引得到具体事件,然后由该事件发出Reset信号
                int index = WaitHandle.WaitAny(waithandles);
                if (index == WaitHandle.WaitTimeout)
                {
                    Console.Write("timeout\r\n");
                }
                else
                {
                    mevents[index].Reset();
                    Console.Write("finished task for {0}\r\n", calcs[index].TaskID);
                }
            }
            Console.ReadKey(true);
        }
    }
    public class Calculator
    {
        //记录事件状态
        private ManualResetEventSlim mevent;
        public int? TaskID { get; private set; }

        public Calculator(ManualResetEventSlim ev)
        {
            this.mevent = ev;
        }

        public void Calculation(object obj)
        {
            Tuple<int, int> data = (Tuple<int, int>)obj;
            Console.Write("Task {0} starts calculation\r\n", Task.CurrentId);
            Thread.Sleep(new Random().Next(3000));
            TaskID = Task.CurrentId;
            Console.Write("Task {0} is ready\r\n", Task.CurrentId);
            mevent.Set();
        }
    }
}

  

mevents[index].Reset(); 将这句屏蔽后,"finished task for"经常是一个固定值,不太理解为什么是这样。不知道是不是Reset之后,waithandle就失效了,WaitHandle.WaitAny(waithandles)就不会获取重复的记录
时间: 2024-10-12 05:22:16

《C#高级编程第七版》多线程之Events的相关文章

c#高级编程第七版 学习笔记 第二章 核心c#

第二章 核心C# 本章内容: 声明变量 变量的初始化和作用域 C#的预定义数据类型 在c#程序中使用条件语句.循环和跳转语句执行流 枚举 名称空间 Main()方法 基本的命令行c#编译器选项 使用System.Console执行控制台I/O 使用内部注释和文档编制功能 预处理器指令 C#编程的推荐规则和约定 2.1 第一个c#程序 2.1.1 代码 using System; namespace Wrox { Public class MyFirstClass { static void Ma

随笔C#高级编程(第七版)

一.对象   和   类型 结构和类的区别在于它们的存储方式.访问方式(类存储在堆(heap)上的引用类型,而结构是存储在栈(stack)上的值类型 ) ps:区别  引用类型  和  值类型  ,请回忆(两个孩子手上的棒棒糖)   和   (两个孩子抢遥控器看电视)的例子 ref 参数迫使变量通过  引用传递的方式参与方法,当然调用该方法时也需要添加 ref 关键字 out 关键字 使得函数可以有多个返回 C#  方法重载的一些小限制: 两个方法不能仅在返回类型上有区别 两个方法不能仅根据参数

c#高级编程第七版 学习笔记 第三章 对象和类型

第三章 对象和类型 本章的内容: 类和结构的区别 类成员 按值和按引用传送参数 方法重载 构造函数和静态构造函数 只读字段 部分类 静态类 Object类,其他类型都从该类派生而来 3.1 类和结构 类和结构都是创建对象的模板,每个对象都包含数据,并提供了处理和访问数据的方法 结构和类的区别是他们在内存中的存储方式.访问方式(类是存储在堆上的引用类型,而结构是存储在栈上的值类型)和他们的一些特征(如结构不支持继承).较小的数据类型使用结构可提高性能.但在语法上,结构和类非常相似,主要的区别是使用

Linux - Unix环境高级编程(第三版) 代码编译

Unix环境高级编程(第三版) 代码编译 本文地址:http://blog.csdn.net/caroline_wendy 时间:2014.10.2 1. 下载代码:http://www.apuebook.com/code3e.html 2. 安装依赖库:sudo apt-get install libbsd-dev  3. 进入下载目录make 4. 复制头文件和动态链接库 sudo cp ./include/apue.h /usr/include/ sudo cp ./lib/libapue

【转】apue《UNIX环境高级编程第三版》第一章答案详解

原文网址:http://blog.csdn.net/hubbybob1/article/details/40859835 大家好,从这周开始学习apue<UNIX环境高级编程第三版>,在此,我要感谢网易的一个工程师朋友和室友,没有他们,我不会开始真正的学习这本书,希望大家以后开始慢慢进步.废话少说,直接上课后习题了. UNIX高级编程第一章习题答案: 1.1在系统上验证,除根目录外,目录l和l l是不同的. 答:这个验证有很多方法可使用命令ls .cd.vim等,目录.指向当前目录,目录..指

《UNIX环境高级编程(第3版)》

<UNIX环境高级编程(第3版)> 基本信息 原书名:Advanced Programming in the UNIX Environment (3rd Edition) (Addison-Wesley Professional Computing Series) 原出版社: Addison-Wesley Professional 作者: (美)W. Richard Stevens    Stephen A. Rago 译者: 戚正伟 张亚英 尤晋元 出版社:人民邮电出版社 ISBN:9787

中文版C#高级编程第8版中的翻译错误

第180页,倒数第三行. 英文原文: If you overload == and !=, you must also override the Equals() and GetHashCode() methods inherited from System.Object; 中文译文: 在重载"=="和"!="时,还必须重载(应该是:重写)从System.Object中继承的Equals()和GetHashCode()方法. 中文版C#高级编程第8版中的翻译错误,布

unix环境高级编程(第三版)中apue.h文件的配置问题

最近刚开始学习unix环境高级编程(第三版),其中有个作者自己写的apue.h文件,在这归总下相应的配置方法,希望对有需要的朋友们有所帮助 首先http://www.apuebook.com/code3e.html 上去下载相应的压缩包,注意自己书的版本. 下载完成之后,鉴于大多数朋友学习linux都是基于虚拟机的,所以顺便附上虚拟机与本地主机传输文件的方式 首先下载SSH Secure Shell 这个工具,然后直接点击quick connect, 弹出如下界面,输入虚拟机的ip地址,和登录用

C#高级编程(第8版)——委托声明、使用(第一节)

首先,声明一个Currency的结构.Currency结构有自己的ToString()重载方法和一个与GetCurrencyUnit()的签名相同的静态方法.这样,就可以用同一个委托变量调用这些方法了: struct Currency { public uint Dollars; public ushort Cents; public Currency(uint dollars, ushort cents) { this.Dollars = dollars; this.Cents = cents