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)
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)
http://blog.csdn.net/HenryLubin/archive/2005/12/08/547178.aspx
http://msdn2.microsoft.com/zh-cn/library/2x96zfy7(VS.80).aspx#Mtps_DropDownFilterText
如果不通过传入该对象,则委托代码中的AutoResetEvent autoEvent = (AutoResetEvent)stateInfo;则不成立
我说说吧:
我对线程的应用等于零,概念知道。
线程可用于WEB中么?
锁???
AJAX不也算是一种线程应用么???
简单讲:
就是某个线程通过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();
}
}
}
估计你关注的是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对象被销毁。
你试着改变那个count参数,比如把10改成20,就明白
autoEvent.WaitOne(5000, false);
stateTimer.Change(0, 500);
的意义了
web上还没见过用System.Threading.Timer的例子