我写了一个定时发送Email的小程序
能够成功达到预期的目的
但是美中不足的是,程序运行时CPU的占用率始终是100%
请教有什么方法可以减少CPU的占用率?
写写!

解决方案 »

  1.   

    代码:
    public static void Main()
    {
    TimerController controller = new TimerController(); TimerCallback timerDelegate = new TimerCallback(CheckStatus); Timer timer = new Timer(timerDelegate, controller, threadIntervalEmail * 1000, threadIntervalEmail * 1000); controller.Controller = timer; while(controller.Controller != null)
    Thread.Sleep(0);
    Console.WriteLine("Done!");
    }

    private static void CheckStatus(Object sender)
    {
    TimerController controller = sender as TimerController;
    if(controller != null)
    {
    controller.Counter++; Mail mail = new Mail();
    mail.SMTPAddress = GetIniConfig("MailServer","SMTPAddress");
    mail.SMTPMailAddress = GetIniConfig("MailServer","AdminMail");
    mail.SMTPMailUserName = GetIniConfig("MailServer","AdminMailUser");
    mail.SMTPMailPassword = GetIniConfig("MailServer","AdminMailPWD");
    if(!mail.SendMail("[email protected]", "hd118.com","come from hd118.com"))
    {
    Console.WriteLine("Can not client smtp server!");
    controller.Dispose();
    }
    Console.WriteLine("This send mail of {0}", controller.Counter);
    if(controller.Counter >= threadIntervalEndTimes)
    {
    Console.WriteLine("Program run {0} times!", controller.Counter);
    controller.Dispose();
    }
    }
    }
      

  2.   

    while(controller.Controller != null)
    Thread.Sleep(0);
    .??????
      

  3.   

    Thread.Sleep(0)的意思是
    当定时器未被Dispose时,应挂起该线程,使其他等待的线程可以执行!
      

  4.   

    顶一下,在线求解!PS.虽然CPU占用是100%,却貌似没有对系统的正常运行有任何影响!
      

  5.   

    while(controller.Controller != null)
    Thread.Sleep(0);这个循环导致 cpu 占有率100%,这个循环在定时器停掉前都是在不停得跑得,情况就跟死循环cpu占有率100%一样。
      

  6.   

    但是这样一个循环在我看来是不可缺少的因为需要一个类似的循环来挂起该程序让定时器可以正常工作实际上该循环看似一个死循环,实际上在定时器完成任务之后该循环会被结束!请看一下CheckStatus方法的代码!有一个Dispose定时器的操作通过在ini文件中修改参数可以在
    if(controller.Counter >= threadIntervalEndTimes)
    {
    Console.WriteLine("Program run {0} times!", controller.Counter);
    controller.Dispose();
    }
    这里Dispose了定时器,该循环也就结束了!