C#中Thread.Time的使用

这个类主要是开启一个线程,然后实现按照指定的周期,定期的调用指定的某个函数,实现了定期调用一个函数或程序的办法。

比如想让一个后台程序,定期检查是否收到邮件,或者让一个后台线程定期输出当前时间等。

改造了一下官方案例:

using System;
using System.Threading;//Thread.Time必备的命名空间
class TimerExample
{
    static void Main()
    {      
        AutoResetEvent autoEvent = new AutoResetEvent(false);//线程等待的类对象,前面在多线程中已经提过,作用是让调用autoEvent.waitone()的程序,在调用处停下来

然后,等待调用autoEvent .set();的另一个程序,用此语句发来信号,信号的意思是,告诉autoEvent.waitone()你可以往下继续执行了                                                                                                  
        StatusChecker statusChecker = new StatusChecker(10);//下面定义好的类,这里实例化一个对象,利用构造函数传入值  
   
       // 一秒之后,每隔0.25秒调用一次CheckStatus
        Timer stateTimer = new Timer(new TimerCallback(statusChecker.CheckStatus), autoEvent, 1000, 250);

   //这个函数是单独开辟的线程,是自动按周期执行,直到调用dispose(),否则该线程一直执行下去//参数1.TimerCallback委托的对象,2.想要给printTime传入的参数3.开始之前需要等待多久(毫秒单位)3.每次调用的时间间隔      
        autoEvent.WaitOne();//等待一个信号,告诉主线程我要不要往下执行!

        stateTimer.Change(0, 500);//收到第一次信号,那我改变一下计时的子线程的函数的调用周期,这里是改变上面Timer中设定的250那个周期值

        Console.WriteLine("\n把调用周期改为1秒一次,等待\n");

        autoEvent.WaitOne();//再次收到信号,信号表示子函数计数又一次到10了

        stateTimer.Dispose();//关闭计时线程的一个命令,如果没有这个命令,那么stateTimer调用子函数会一直执行下去,按照指定周期

        Console.WriteLine("\nDestroying timer.,当前线程:" + Thread.CurrentThread.ManagedThreadId);
        //Console.ReadKey();
    }
}
class StatusChecker
{
    private int invokeCount;
    private int maxCount;
    public StatusChecker(int count)
    {
        invokeCount = 0;
        maxCount = count;
    }    
    public void CheckStatus(Object stateInfo)  // 被调用的,被TimerCallback委托的函数,必须是具有object 形参且必须为void的返回值的
    {
        Thread T = Thread.CurrentThread;
        T.Name = "子线程";
        AutoResetEvent autoEvent = (AutoResetEvent)stateInfo;
        Console.WriteLine("{0} Checking status {1,2}.", DateTime.Now.ToString("h:mm:ss.fff"), (++invokeCount).ToString() + "当前线程 ID : " + Thread.CurrentThread.ManagedThreadId + "当前线程 名称:" + Thread.CurrentThread.Name);

        if (invokeCount == maxCount)
        {
            // Reset the counter and signal the waiting thread.
            invokeCount = 0;
            autoEvent.Set();//子函数执行到这里开始发送信号,告诉主程序你可以往下执行,但是这个函数是不停的按照周期被调用的,知道
        }
    }
}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Unity3d青子

难题的解决使成本节约,求打赏

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值