关于定时器占用CPU的问题! 我写了一个定时发送Email的小程序能够成功达到预期的目的但是美中不足的是,程序运行时CPU的占用率始终是100%请教有什么方法可以减少CPU的占用率?写写! 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 代码: 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(); } } } while(controller.Controller != null) Thread.Sleep(0);.?????? Thread.Sleep(0)的意思是当定时器未被Dispose时,应挂起该线程,使其他等待的线程可以执行! 顶一下,在线求解!PS.虽然CPU占用是100%,却貌似没有对系统的正常运行有任何影响! while(controller.Controller != null) Thread.Sleep(0);这个循环导致 cpu 占有率100%,这个循环在定时器停掉前都是在不停得跑得,情况就跟死循环cpu占有率100%一样。 但是这样一个循环在我看来是不可缺少的因为需要一个类似的循环来挂起该程序让定时器可以正常工作实际上该循环看似一个死循环,实际上在定时器完成任务之后该循环会被结束!请看一下CheckStatus方法的代码!有一个Dispose定时器的操作通过在ini文件中修改参数可以在 if(controller.Counter >= threadIntervalEndTimes) { Console.WriteLine("Program run {0} times!", controller.Counter); controller.Dispose(); }这里Dispose了定时器,该循环也就结束了! 打印时选择打印机的问题! C# 有免费的FTP客户端组件吗? 读文本的问题,把问题和选项分开,如何读?? 如何将rtf 保存成图片格式? 如何知道客户端的位置? 自动登录网页的程序,如何处理安全警告? 麻烦事,请各位高手帮忙! c#读取EXCEL标签名问题(急!),请高手们指点一下.谢谢了. 取三天以前的时间及取一个星期以前的时间及一个月以前的时间及一年以前的时间怎么用C#中的DateTime这个类中所提供的方法和属性实现,或 如何才能安回车确认 求用ODBC方式调用MYSQL的存贮过程 一个很简单的数据库(C/S)系统的问题,在线求助!
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();
}
}
}
Thread.Sleep(0);
.??????
当定时器未被Dispose时,应挂起该线程,使其他等待的线程可以执行!
Thread.Sleep(0);这个循环导致 cpu 占有率100%,这个循环在定时器停掉前都是在不停得跑得,情况就跟死循环cpu占有率100%一样。
if(controller.Counter >= threadIntervalEndTimes)
{
Console.WriteLine("Program run {0} times!", controller.Counter);
controller.Dispose();
}
这里Dispose了定时器,该循环也就结束了!