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

Mak*_*kah 2 c# multithreading timer handler

我正试图处理这个Timer例外.如果类有类似的东西HandlerExceptionEvent我们可以添加一些事件来记录某些东西或停止计时器,那将是很好的.

PS:我不想在里面添加一个try/ catchblock 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!");
 }
}
Run Code Online (Sandbox Code Playgroud)

Joh*_*ren 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...
    } 
};
Run Code Online (Sandbox Code Playgroud)

这样,实际的处理程序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;
                }
            }
        };
    }
}
Run Code Online (Sandbox Code Playgroud)

  • @Makah - 嗯,我已经为你提供了一个,为什么不使用我为你写的那个? (2认同)
  • 呵呵,有时你只需编写代码. (2认同)