调用事件时使用Thread.Sleep,但不会;不行?(C#)

本文关键字:不行 事件 Thread Sleep 调用 | 更新日期: 2023-09-27 17:54:08

每个人:我最近使用《图解C#2010》**学习csharp,我刚刚来到第16章"事件"**其中有一个示例,我运行了原始代码,但得到了不同的结果我真的很困惑!以下是代码:

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();
        }
    }
}

书中说,当线程睡眠2.25s时,我们将让TimerHandler A和B都执行两次。屏幕上应该有4行。像这样:

>>class A handler called!
>>class B handler called!
>>class A handler called!
>>class B handler called!

但在我运行代码后,TimerHandler A和B被调用了2次以上,就像永远一样像这样:

>>class A handler called!
>>class B handler called!
>>class A handler called!
>>class B handler called!
>>class A handler called!
>>class B handler called!
>>class A handler called!
>>class B handler called!
......

我想使用thread.sleep有问题,但我还没有学到任何关于C#中线程的知识。。。在书中,没有解释为什么我们应该使用thread.sleep,以及为什么使用它会控制事件只执行两次。

有人能解释一下吗?这是这本书中的一个错误吗?或者我有什么问题?我在XP上使用vs2010。

谢谢!

调用事件时使用Thread.Sleep,但不会;不行?(C#)

程序有Console.ReadLine(),它将永远等待,直到您按下Return键。在等待期间,计时器仍在运行,因此将触发事件。在这种情况下,Thread.Sleep是没有意义的。

我想作者的意图是防止Console应用程序在你看到结果之前退出并消失。

如果你评论掉ReadLine(),程序将按照书中的描述运行,但应用程序将退出,并在2.25秒后立即消失,所以请密切关注屏幕以查看效果。