使用System.Timers.Timer类实现程序定时执行

时间:2022-06-29 07:58:36

     在C#里关于定时器类有3个:System.Windows.Forms.Timer类、System.Threading.Timer类和System.Timers.Timer类。

     System.Windows.Forms.Timer是应用于WinForm中的,它是通过Windows消息机制实现的,类似于VB或Delphi中的Timer控件,内部使用API  SetTimer实现的。它的主要缺点是计时不精确,而且必须有消息循环,Console  Application(控制台应用程序)无法使用。

      System.Timers.Timer和System.Threading.Timer非常类似,它们是通过.NET Thread Pool实现轻量、精确的计时,对应用程序、消息没有特别的要求。System.Timers.Timer还可以应用于WinForm,完全取代上面的Timer控件。它们的缺点是不支持直接的拖放,需要手工编码。

         public   int  wrong  =   0 ;
        System.Timers.Timer time 
=   new  System.Timers.Timer();
        
        
private   void  begin_Click( object  sender, EventArgs e)
        {
            
if  (action.Text  ==   " 启动监测 " )
            {
                action.Text 
=   " 停止监测 " ;
                label2.Text 
=   " 已启动 " ;

                
if  (time.Interval.ToString()  ==   " 100 " //  The default value of interval is 100s.
                {
                    time.Elapsed 
+=   new  ElapsedEventHandler(TimeEvent);
                    time.Interval 
=   1000 ;
                }
                time.Enabled 
=   true ;
            }
            
else
            {
                action.Text 
=   " 启动监测 " ;
                label2.Text 
=   " 已停止 " ;

                time.Enabled 
=   false ;
            }

        }

        
private   static   void  TimeEvent( object  source, ElapsedEventArgs e)
        {
            
int  tsec  =  e.SignalTime.Second;
            
int  isec  =   10 ;
            
if  (tsec  ==  isec)  // it will be activated at 10s of every minutes.
            {
                
if  ( ! Check( " http://www.test.com " ))
                {
                    
string  smtp_server = " 192.168.8.1 " ;
                    
int  port  =   25 ;
                    
string  mail_from  =   " test_from@163.com " ;
                    
string  sender = " test " ;
                    
string  mail_to  =   " test_to@163.com " ;
                    
string  receiver = " adminer " ;
                    
string  subject  =   " The site is run out exception on  "   +  DateTime.Now.ToString( " yyyyMMddhhmmss " );
                    
string  body  =   " The site can not open on  "   +  DateTime.Now.ToString()  +   " ,please check it ! " ;
                    
try
                    {
                        SendEmail(smtp_server, port, mail_from, sender, mail_to, receiver, subject, body);
                    }
                    
catch (Exception ex)
                    {
                        MessageBox.Show(ex.Message);
                    }
                }
            }
        }

        
private   static   bool  Check( string  urlStr)
        {
            HttpWebRequest myWebRequest 
=   null ;
            
try
            {
                myWebRequest 
=  (HttpWebRequest)WebRequest.Create(urlStr);
                HttpWebResponse res 
=  (HttpWebResponse)myWebRequest.GetResponse();
                
if  (res.StatusCode  ==  HttpStatusCode.OK)
                {
                    res.Close();
                    
return   true ;
                }
                
else
                {
                    res.Close();
                    
return   false ;
                }
            }
            
catch  (Exception)
            {
                
return   false ;
            }
        }

        
public   static   void  SendEmail( string  smtp_server,  int  port,  string  mail_from,  string  sender,  string  mail_to,  string  receiver,  string  subject,  string  body)
        {
            MailAddress from 
=   new  MailAddress(mail_from, sender);
            MailAddress to 
=   new  MailAddress(mail_to, receiver);
            MailMessage message 
=   new  MailMessage(from, to);
            message.BodyEncoding 
=  Encoding.UTF8;
            message.IsBodyHtml 
=   true ;
            message.Subject 
=  subject;
            message.Body 
=  body;

            SmtpClient client 
=   new  SmtpClient(smtp_server, port);
            
// SmtpClient client = new SmtpClient(smtp_server);

            
//  Add credentials if the SMTP server requires them. 
            client.Credentials  =  CredentialCache.DefaultNetworkCredentials;
            client.Send(message);
        }