关于timer类的疑问[附代码]

一品梅 2008-04-21 11:00:17
using System;
using System.Threading;

class TimerExample
{
static void Main()
{
AutoResetEvent autoEvent = new AutoResetEvent(false);
StatusChecker statusChecker = new StatusChecker(10);

// Create the delegate that invokes methods for the timer.
TimerCallback timerDelegate =
new TimerCallback(statusChecker.CheckStatus);

// Create a timer that signals the delegate to invoke
// CheckStatus after one second, and every 1/4 second
// thereafter.
Console.WriteLine("{0} Creating timer.\n",
DateTime.Now.ToString("h:mm:ss.fff"));
Timer stateTimer =
new Timer(timerDelegate, autoEvent, 1000, 250);
////////////////////////////从这里我就读不大懂了,具体各个参数是什么意思,AUTOEVENT是怎么回事,对应前后文。
// When autoEvent signals, change the period to every
// 1/2 second.
autoEvent.WaitOne(5000, false);
stateTimer.Change(0, 500);
Console.WriteLine("\nChanging period.\n");

// When autoEvent signals the second time, dispose of
// the timer.
autoEvent.WaitOne(5000, false);
stateTimer.Dispose();
Console.WriteLine("\nDestroying timer.");
}
}

class StatusChecker
{
int invokeCount, maxCount;

public StatusChecker(int count)
{
invokeCount = 0;
maxCount = count;
}

// This method is called by the timer delegate.
public void CheckStatus(Object stateInfo)
{
AutoResetEvent autoEvent = (AutoResetEvent)stateInfo;
Console.WriteLine("{0} Checking status {1,2}.",
DateTime.Now.ToString("h:mm:ss.fff"),
(++invokeCount).ToString());

if(invokeCount == maxCount)
{
// Reset the counter and signal Main.
invokeCount = 0;
autoEvent.Set();
}
}
}

最近看了下聊天室的代码,里面用到了该类 与一些其它的定时器处理之间有什么区别(JAVASCRIPT或AJAX)
...全文
227 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
LutzMark 2008-04-23
  • 打赏
  • 举报
回复
StatusChecker statusChecker = new StatusChecker(10);
你试着改变那个count参数,比如把10改成20,就明白
  autoEvent.WaitOne(5000, false);
stateTimer.Change(0, 500);

的意义了
web上还没见过用System.Threading.Timer的例子
一品梅 2008-04-22
  • 打赏
  • 举报
回复
有些问题,我是不明白其存在意义,所以一直没有深入学习下去。但是我很想掌握,现在。有谁教教我???
一品梅 2008-04-22
  • 打赏
  • 举报
回复
还是不知所以。
我说说吧:
我对线程的应用等于零,概念知道。
线程可用于WEB中么?
锁???
AJAX不也算是一种线程应用么???
hy_lihuan 2008-04-22
  • 打赏
  • 举报
回复
没有关注过
zhujiechang 2008-04-22
  • 打赏
  • 举报
回复
表示传入AUTOEVENT
如果不通过传入该对象,则委托代码中的AutoResetEvent autoEvent = (AutoResetEvent)stateInfo;则不成立
Magic_YJL 2008-04-22
  • 打赏
  • 举报
回复
关注中,期待高手。。。
huaer1011 2008-04-22
  • 打赏
  • 举报
回复
帮你找了一下,看看这个链接对你有用没
http://blog.csdn.net/HenryLubin/archive/2005/12/08/547178.aspx
huaer1011 2008-04-22
  • 打赏
  • 举报
回复
先帮你顶下~
MetaDunDun 2008-04-22
  • 打赏
  • 举报
回复
实例就要看你的需求了阿,这个可以用在很多方面。
估计你关注的是Timer类吧,这里面加了个AutoResetEvent进去,所以不太好理解
你问与一些其它的定时器处理之间有什么区别(JAVASCRIPT或AJAX)
从功能上没太大区别,不过这个Timer是服务端的定时器,你要比较的那2个是客户端的计时器,估计是聊天室里用来客户端轮询服务器要用到吧
AJAX里面用的应该是System.Web.UI.Timer,你贴的代码是System.Threading.Timer,再举个简单的例子:

class TimerExample
{
static void Main()
{
StatusChecker statusChecker = new StatusChecker();
TimerCallback timerDelegate = new TimerCallback(statusChecker.CheckStatus);
Timer stateTimer = new Timer(timerDelegate, "我是被调方法的参数", 0, 250);
}
}

class StatusChecker
{
//将被Timer调用的方法
public void CheckStatus(Object stateInfo)
{
Console.WriteLine(stateInfo);
}
}


这样就会每隔250毫秒调用一次CheckStatus这个方法,直到Timer对象被销毁。
cat_hsfz 2008-04-22
  • 打赏
  • 举报
回复
这是System.Threading.Timer,详细信息请看MSDN。(注意现在.NET里面的Timer类有好几个,请用namespace区分清楚。)

这个Timer的作用是,指定一个函数,定时在另外一个线程里调用该函数。
一品梅 2008-04-22
  • 打赏
  • 举报
回复
非常感谢楼上的,可是我还是对其应用不是熟悉.仍然有云里雾里的感觉,能介绍推荐个WEB实例吧,生动些的^&^
MetaDunDun 2008-04-22
  • 打赏
  • 举报
回复
这里要先弄明白AutoResetEvent,AutoResetEvent可以用来通知正在等待的线程已发生事件(AutoResetEvent的状态改变),允许线程通过发信号互相通信。

简单讲:
就是某个线程通过AutoResetEvent的WaitOne()阻塞自己(无限长或指定时间),并一直等待直到下面2种情况之一发生时:
1.另一个线程(或者当前线程)通过AutoResetEvent的Set方法(使AutoResetEvent的状态改变)通知自己。
2.等待超时。
然后该线程将继续执行(不影响发出通知的线程的执行)。

具体讲:
首先要知道AutoResetEvent有2种状态:终止状态和非终止状态,理解这点很重要,通过构造函数 AutoResetEvent(bool initialState)可以指定初始状态:要将初始状态设置为终止,则为true;非终止,则为false。还可以用AutoResetEvent的Set方法将其置为终止状态,Reset方法置为非终止状态。
然后要知道WaitOne()这个方法,这个方法就是用来阻止当前线程用的,具体用法后面再讲。这个方法有2个重载WaitOne(Int32, Boolean)和WaitOne(TimeSpan, Boolean),拿WaitOne(Int32, Boolean)来讲:
第一个参数是等待的毫秒数,值为-1时,表示无限期等待。
第二个参数是指示在等待之前是否要先退出上下文的同步域,并在调用完成之后重新获取。一般情况下这个参数只要设为false即可。
返回值是bool值,3种情况:
1.收到信号:AutoResetEvent的状态由非终止(调用WaitOne之前)变为终止(调用WaitOne之后)或者调用WaitOne之前AutoResetEvent的状态已经为终止,返回true。
2.等待超时(没有收到信号),返回false。
3.收不到信号(AutoResetEvent的状态一直为非终止),则 WaitOne 永不返回。
WaitOne()等效于调用 WaitOne(-1, false)。WaitOne(TimeSpan, Boolean)只是把等待时间用TimeSpan来代替毫秒。

讲下一般的使用过程:
1.某个线程通过调用 AutoResetEvent 的 WaitOne 来阻塞调用线程并等待信号。
a.如果 AutoResetEvent 处于非终止状态,则该线程阻塞,等待信号。
b.如果处于终止状态,则方法将直接返回true,该线程将继续执行,AutoResetEvent将自动返回非终止状态(这也是为什么叫AutoResetXXXX了)。
2.如果是第1条中的a情况,那么另一个线程(或者当前线程)就可以在需要的时候调用Set方法将AutoResetEvent的状态变成终止(发信号),以释放在等待信号的线程(调用WaitOne的那个线程)。此时AutoResetEvent将保持终止状态,直到一个等待的线程被释放,然后自动返回非终止状态。

PS:如果没有任何线程在等待的时候调用Set方法,则AutoResetEvent将一直保持为终止状态,就是说在这之后调用WaitOne将不会等待直接返回true。

明白了以上内容,再结合我在代码里加的说明,应该可以理解这个例子了。表达不好,希望对你有帮助。


class TimerExample
{
static void Main()
{
//实例化AutoResetEvent,初始状态为非终止
AutoResetEvent autoEvent = new AutoResetEvent(false);

//实例化StatusChecker,Timer将要调用其方法CheckStatus,这里传入的参数10是
//用来控制Timer每调用10次CheckStatus方法将调用一次AutoResetEvent的Set方法(发信号)
StatusChecker statusChecker = new StatusChecker(10);

//为Timer创建一个TimerCallback委托用来调用CheckStatus
TimerCallback timerDelegate =
new TimerCallback(statusChecker.CheckStatus);

Console.WriteLine("{0} Creating timer.\n",
DateTime.Now.ToString("h:mm:ss.fff"));

//创建一个Timer,传入timerDelegate来调用CheckStatus,autoEvent是CheckStatus方法的参数
//1000是1000毫秒后开始执行Timer,250是执行的间隔为250毫秒
Timer stateTimer =
new Timer(timerDelegate, autoEvent, 1000, 250);

//然后调用WaitOne阻塞当前线程5秒,并等待信号。
//同时大概1秒左右后,Timer就会从另一线程开始每隔250毫秒调用一次CheckStatus方法
autoEvent.WaitOne(5000, false);

//当收到信号或者超时后就改变Timer的执行间隔为500毫秒
//Timer将立刻每隔500毫秒继续调用CheckStatus方法
stateTimer.Change(0, 500);
Console.WriteLine("\nChanging period.\n");

//再次调用WaitOne阻塞当前线程5秒,并等待信号。
autoEvent.WaitOne(5000, false);
//当收到信号或者超时后就释放Timer对象
stateTimer.Dispose();
Console.WriteLine("\nDestroying timer.");
}
}

class StatusChecker
{
int invokeCount, maxCount;

public StatusChecker(int count)
{
invokeCount = 0;
maxCount = count;
}

//将被Timer调用的方法
public void CheckStatus(Object stateInfo)
{
AutoResetEvent autoEvent = (AutoResetEvent)stateInfo;
Console.WriteLine("{0} Checking status {1,2}.",
DateTime.Now.ToString("h:mm:ss.fff"),
(++invokeCount).ToString());

if(invokeCount == maxCount)
{
//初始化计数器并调用Set改变autoEvent状态为终止(给所有等待的线程发信号)
invokeCount = 0;
autoEvent.Set();
}
}
}
huaer1011 2008-04-22
  • 打赏
  • 举报
回复
帮你UP吧~
叶子 2008-04-21
  • 打赏
  • 举报
回复
区别很大,和定时器的用法和功能都有区别。
datahandler2 2008-04-21
  • 打赏
  • 举报
回复
不大懂,关注下,顶起来
懒牛科技 2008-04-21
  • 打赏
  • 举报
回复
汉升软件 2008-04-21
  • 打赏
  • 举报
回复
關注ing...

62,075

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧