如何将事件/异常从计时器事件处理程序返回到C#中的主线程?

时间:2012-06-05 08:31:05

标签: c# .net exception timer

我有Windows服务应用程序(没有winforms)。在Main方法中我启动了计时器。 Timer elapsed事件处理程序在新线程(?)中运行。有没有简单的方法如何将例程从经过时间的事件处理程序中抛出回主线程?

我试图处理处理程序体中的异常并引发自定义事件,但是当我在上升此事件时重新启动主进程时,现在运行2个进程同时执行相同的操作。

如何将事件或异常信息从定时器事件处理程序线程返回到主线程?

谢谢。

编辑:

using System;
using System.Security.Permissions;
using System.Timers;

namespace TestingConsoleApplication.Model
{
    static class ThreadExceptionTester
    {
    [SecurityPermission(SecurityAction.Demand, Flags = SecurityPermissionFlag.ControlAppDomain)]
    public static void Run()
    {
        AppDomain currentDomain = AppDomain.CurrentDomain;
        currentDomain.UnhandledException += new UnhandledExceptionEventHandler(MyHandler);

        Timer Timer = new Timer(1000);
        Timer.Elapsed += new ElapsedEventHandler(TimerEventHandler);
        Timer.Start();

        try
        {
            throw new Exception("1");
        }
        catch (Exception e)
        {
            Console.WriteLine("Catch clause caught : " + e.Message);
        }

        //throw new Exception("2");
    }

    static void MyHandler(object sender, UnhandledExceptionEventArgs args)
    {
        Exception e = (Exception)args.ExceptionObject;
        Console.WriteLine("MyHandler caught : " + e.Message);
    }

    static void TimerEventHandler(object source, ElapsedEventArgs e)
    {
        Console.WriteLine("Throwing from timer event handler");
        throw new Exception("timer exception");
    }
}
}

这写在控制台上:

Catch clause caught : 1
Throwing from timer event handler

然后使用未处理的异常对throw new Exception(“timer exception”)进行程序崩溃;如果我取消注释抛出新的异常(“2”);处理执行并在控制台上也“捕获Catch子句:2”。换句话说,MyHandler不会处理计时器异常。

1 个答案:

答案 0 :(得分:2)

您需要使用AppDomain.UnhandledException事件订阅所有异常事件。

修改 根据MSDN:

  

在.NET Framework 2.0及更早版本中,Timer组件   捕获并抑制事件处理程序抛出的所有异常   经历的事件。此行为在将来的版本中可能会更改   .NET Framework。

我使用dotPeek从.NET4查看了System.Timers.Timer的源代码,自2.0以来仍然没有变化,所以请考虑使用System.Threading.Timer。