私は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によって処理されません。