调用事件时使用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。
谢谢!
程序有Console.ReadLine()
,它将永远等待,直到您按下Return键。在等待期间,计时器仍在运行,因此将触发事件。在这种情况下,Thread.Sleep
是没有意义的。
我想作者的意图是防止Console应用程序在你看到结果之前退出并消失。
如果你评论掉ReadLine()
,程序将按照书中的描述运行,但应用程序将退出,并在2.25秒后立即消失,所以请密切关注屏幕以查看效果。