日期:2014-05-17  浏览次数:20770 次

关于Windows服务中的Timer
各位好我现在有一个问题如下:
我在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();[color=#FF0000][/color] }
  }
  ...//其他要执行的代码
}
说明:Helper.GetMailServer()是从数据库表中获取POP3服务器的信息,包括服务器,登入用户名和密码及端口等,Timer每次触发Elapsed事件时都会读取新的POP3服务器信息(有提供界面用来修改POP3服务器的信息),现在的问题是:如果程序在执行的过程中登入POP3邮箱服务器错误,比如超时,或POP3服务器设置错误,我想重写让这个Elapsed处理程序回到var server = Helper.GetMailServer();这一行来执行,可以实现吗?应该不需要使用goto语句吧?

------解决方案--------------------
C# code

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();[color=#FF0000][/color] }
  }
timer.Enable = true;
  ...//其他要执行的代码
}