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

发布于 2022-09-03 08:08:29 字数 2249 浏览 19 评论 0

各位好:
最近在学习《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。。。。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

离旧人 2022-09-10 08:08:29

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

唠甜嗑 2022-09-10 08:08:29

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

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上了????

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文