各位好我现在有一个问题如下:
我在Windows服务中使用了一个Timer对象来定时从POP3服务器中接收邮件,Timer的Elapsed事情处理程序如下:protected void ReceiveEmail(object sender, ElapsedEventArgs e)
{
            var server = Helper.GetMailServer();//从数据库中得到POP3服务器信息
            using (Imap imap = new Imap())//Imap是一个邮件接收类dll
            {
                try
                {
                    imap.Connect(server.POP3ServerName);//POP3服务器名称
                    imap.Login(server.POP3ServerUserName, server.POP3ServerPassword);//POP3服务器用户名和密码
                    imap.SelectInbox();
                }
                catch
                {
                    imap.Close();
                    //如果出现异常,我想回到var server = Helper.GetMailServer();                }
             }
             ...//其他要执行的代码
}
说明:Helper.GetMailServer()是从数据库表中获取POP3服务器的信息,包括服务器,登入用户名和密码及端口等,Timer每次触发Elapsed事件时都会读取新的POP3服务器信息(有提供界面用来修改POP3服务器的信息),现在的问题是:如果程序在执行的过程中登入POP3邮箱服务器错误,比如超时,或POP3服务器设置错误,我想重写让这个Elapsed处理程序回到var server = Helper.GetMailServer();这一行来执行,可以实现吗?应该不需要使用goto语句吧?

解决方案 »

  1.   


    protected void ReceiveEmail(object sender, ElapsedEventArgs e)
    {
      var server = Helper.GetMailServer();//从数据库中得到POP3服务器信息
      using (Imap imap = new Imap())//Imap是一个邮件接收类dll
      {
      try
      {
    timer1.Enable=false;//处理时先停掉timer,一面多次进入
    //......  }
      catch
      {
      imap.Close();
    timer.Enable = true;
    //还可以下面直接调用
    ReceiveEmail(this,null);
      //如果出现异常,我想回到var server = Helper.GetMailServer(); }
      }
    timer.Enable = true;
      ...//其他要执行的代码
    }
      

  2.   

    不用goto,可以用while,总之是个循环。
      

  3.   

    这样写,可能导致死循环,while吧,好控制一些,错误次数到一定时候,跳出,几日志之类的