0

我有 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"); 上出现未处理的异常而崩溃;如果我取消注释 throw new Exception("2"); Exeption 被处理并且在控制台上也是“Catch 子句被捕获:2”。换句话说,计时器异常不是由 MyHandler 处理的。

4

1 回答 1

2

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

编辑: 根据 MSDN:

在 .NET Framework 2.0 版及更早版本中,Timer 组件捕获并抑制由 Elapsed 事件的事件处理程序引发的所有异常。此行为可能会在 .NET Framework 的未来版本中发生更改。

我已经使用 dotPeek 从 .NET4 查看了 System.Timers.Timer 的来源,但自 2.0 以来仍然没有任何变化,因此请考虑改用 System.Threading.Timer。

于 2012-06-05T09:04:49.930 回答