0

私はWindowsサービスアプリケーションを持っています(winformsはありません)。Mainメソッドでタイマーを開始しました。タイマー経過イベントハンドラーが新しいスレッド(?)で実行されています。タイマー経過イベントハンドラーからメインスレッドに例外をスローする簡単な方法はありますか?

ハンドラー本体で例外を処理し、カスタムイベントを発生させようとしましたが、このイベントの発生時にメインプロセスを再起動すると、同じことを同時に実行する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");で、未処理の例外が発生してプログラムがクラッシュします。コメントを外すと、新しいException( "2");をスローします。例外が処理され、コンソールでも「キャッチ句がキャッチされました:2」です。つまり、タイマー例外はMyHandlerによって処理されません。

4

1 に答える 1

2

すべての例外イベントをサブスクライブするには、 AppDomain.UnhandledExceptionイベントを使用する必要があります。

編集: MSDNによると:

.NET Frameworkバージョン2.0以前では、Timerコンポーネントは、Elapsedイベントのイベントハンドラーによってスローされたすべての例外をキャッチして抑制します。この動作は、.NETFrameworkの将来のリリースで変更される可能性があります。

dotPeekを使用して.NET4からSystem.Timers.Timerのソースを調べましたが、2.0以降の変更はまだないため、代わりにSystem.Threading.Timerの使用を検討してください。

于 2012-06-05T09:04:49.930 に答える