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)

解决方案 »

  1.   

    帮你找了一下,看看这个链接对你有用没
    http://blog.csdn.net/HenryLubin/archive/2005/12/08/547178.aspx
      

  2.   

    这不是msdn中的例子吗
    http://msdn2.microsoft.com/zh-cn/library/2x96zfy7(VS.80).aspx#Mtps_DropDownFilterText
      

  3.   

    表示传入AUTOEVENT
    如果不通过传入该对象,则委托代码中的AutoResetEvent autoEvent = (AutoResetEvent)stateInfo;则不成立
      

  4.   

    还是不知所以。
    我说说吧:
    我对线程的应用等于零,概念知道。
    线程可用于WEB中么?
    锁???
    AJAX不也算是一种线程应用么???
      

  5.   

    这里要先弄明白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();
            }
        }
    }
      

  6.   

    非常感谢楼上的,可是我还是对其应用不是熟悉.仍然有云里雾里的感觉,能介绍推荐个WEB实例吧,生动些的^&^
      

  7.   

    这是System.Threading.Timer,详细信息请看MSDN。(注意现在.NET里面的Timer类有好几个,请用namespace区分清楚。)这个Timer的作用是,指定一个函数,定时在另外一个线程里调用该函数。
      

  8.   

    实例就要看你的需求了阿,这个可以用在很多方面。
    估计你关注的是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对象被销毁。
      

  9.   

    StatusChecker  statusChecker = new StatusChecker(10);
    你试着改变那个count参数,比如把10改成20,就明白
      autoEvent.WaitOne(5000, false);
            stateTimer.Change(0, 500);
    的意义了
    web上还没见过用System.Threading.Timer的例子