如何使用Timer(Thread)类处理异常

时间:2011-03-23 14:39:00

标签: c# multithreading timer handler

我试图处理Timer的例外情况。如果类具有HandlerExceptionEvent之类的内容会很好,这样我们就可以添加一些事件来记录某些内容或停止计时器。

PS:我不想在try内添加catch / ElapsedEventHandler()块。

class Program
{
static void Main(string[] args) {
  System.Timers.Timer t = new System.Timers.Timer(1000);
  t.Elapsed += new System.Timers.ElapsedEventHandler(t_Elapsed);
  t.Start();     

  System.Threading.Thread.Sleep(10000);
  t.Stop();
  Console.WriteLine("\nDone.");      
  Console.ReadLine();
}

 static void t_Elapsed(object sender, System.Timers.ElapsedEventArgs e) {
   Console.WriteLine("Ping!");
   throw new Exception("Error!");
 }
}

1 个答案:

答案 0 :(得分:11)

  

PS:我不想在ElapsedEventHandler()中添加“try / catch Exception”

由于Timer类不支持这样的事件,否则你怎么会捕获异常?

如果您坚持使用Timer类,那么这可能是您唯一的选择:

var t = new System.Timers.Timer(1000);
t.Elapsed += (sender, e) => { 
    try 
    { 
        t_Elapsed(sender, e); 
    } 
    catch (Exception ex) 
    { 
        // Error handling here...
    } 
};

这样,实际的处理程序t_Elapsed不包含任何错误处理,您可以为Timer类创建一个包装类,它隐藏了这个实现细节,并为异常处理提供了一个事件。

这是一种方法:

class ExceptionHandlingTimer
{
    public event Action<Exception> Error;

    System.Timers.Timer t;

    public ExceptionHandlingTimer(double interval)
    {
        t = new System.Timers.Timer(interval);
    }

    public void Start()
    {
        t.Start();
    }

    public void AddElapsedEventHandler(ElapsedEventHandler handler)
    {
        t.Elapsed += (sender, e) =>
        {
            try
            {
                handler(sender, e);
            }
            catch (Exception ex)
            {
                if (Error != null)
                {
                    Error(ex);
                }
                else
                {
                    throw;
                }
            }
        };
    }
}