在事件/委托中使用Thread.Sleep无果,请指点?!

各位好:
最近在学习《C#2010图解教程》中的“事件”一章,并照着敲了一遍代码。
但是得到的结果和书中的结果不一样。。。。
先看代码:大体的框架很简单,就是生成一个我们自定义的事件MyElapsed,利用system.timers.timer中的公共事件Elapsed计时器,把触发自定义事件MyElapsed的私有方法OnOneSecond注册到公共事件Elapsed计时器上,这样我们自定义的事件MyElapsed也可以定时被触发。然后再把两个方法注册到MyElapsed上,实现定时输出。

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Threading;

namespace EventSample1

{

public class MyTimerClass //声明自定义类

{

public event EventHandler MyElapsed; //声明自定义的事件

//定义事件的触发代码

private void OnOneSecond(object source, EventArgs args)

{

if(MyElapsed != null)

MyElapsed(source, args); //触发事件

}

//----

private System.Timers.Timer MyPrivateTimer; //声明一个私有计时器

//构造函数

public MyTimerClass()

{

MyPrivateTimer = new System.Timers.Timer(); //实例化计时器

MyPrivateTimer.Elapsed += OnOneSecond; //将触发事件的私有方法注册到计时器的公共事件上

//设置公共事件的属性

MyPrivateTimer.Interval = 1000;

MyPrivateTimer.Enabled = true;

}

}

//提供订阅在自定义事件上的处理程序

class classA

{

public void TimerHandlerA(object source, EventArgs args)

{

Console.WriteLine("class A handler called!");

}

}

class classB

{

public static void TimerHandlerB(object source, EventArgs args)

{

Console.WriteLine("class B handler called!");

}

}

//主程序

class Program

{

static void Main()

{

classA ca = new classA();

MyTimerClass mc = new MyTimerClass();

//----

mc.MyElapsed += ca.TimerHandlerA;

mc.MyElapsed += classB.TimerHandlerB;

//----

Thread.Sleep(2250);

Console.ReadLine();

}

}

}

按照我们的理解,在线程sleep的2秒多时间内,MyElapsed事件会被触发2次,因此应该输出共4句语句后便停止在readline上了。书上也是这么说的。
但是实际运行的结果是:语句会不停的输出,如下:
图片描述

不知道原因在什么地方?
请指教

我使用的是vs2010,winXp。。。。

回答:

这句话-“在线程sleep的2秒多时间内,MyElapsed事件会被触发2次”你是怎么得出来的?

回答:

这个问题,先要理解一下主程序是在干啥

class Program

{

static void Main()

{

classA ca = new classA();

MyTimerClass mc = new MyTimerClass(); //因为定时器是写在构造函数里,所以这时候定时器已经启动了

//----

mc.MyElapsed += ca.TimerHandlerA; //给MyElapsed事件添加了一个处理函数

mc.MyElapsed += classB.TimerHandlerB; //给MyElapsed事件又添加了一个处理函数

//----

Thread.Sleep(2250); //主程序傻等了2.25秒

Console.ReadLine(); //主程序在等你输入,没有结束,如果你不按回车(输入一行),主程序会一直在走......

}

}

至于你那个破书

这个是对的:在线程sleep的2秒多时间内,MyElapsed事件会被触发2次,因此应该输出共4句语句

后面这个是错的:后便停止在readline上了????

以上是 在事件/委托中使用Thread.Sleep无果,请指点?! 的全部内容, 来源链接: utcz.com/p/189977.html

回到顶部