あなたの例では、コンソールアプリケーションであれば、自分のメインメソッドが終了します...
をTasks
でこれを行うには良い方法がある.NET 4を使用していますが、Threads
を使用する必要があると仮定している場合おそらくGo
が実行を開始する前に。したがって、例外がスローされたときにあなたの「メインスレッド」が存在しない可能性があります。これをやめるには、同期が必要です。このような
何かが行う必要があります。
static Exception _ThreadException = null;
public static void Main()
{
var t = new Thread (Go);
t.Start();
// this blocks this thread until the worker thread completes
t.Join();
// now see if there was an exception
if (_ThreadException != null) HandleException(_ThreadException);
}
static void HandleException(Exception ex)
{
// this will be run on the main thread
}
static void Go()
{
try
{
// ...
throw null; // The NullReferenceException will get caught below
// ...
}
catch (Exception ex)
{
_ThreadException = ex;
}
}
を、これはUIアプリであれば、物事は少し簡単です。 UIスレッドの参照をGo
メソッドに渡す必要がありますので、例外をどこに送信するのかが分かります。これを行う最善の方法は、UIスレッドのSynchronizationContext
を渡すことです。
このような何かが働くだろう:
public static void Main()
{
var ui = SynchronizationContext.Current;
new Thread (() => Go(ui)).Start();
}
static void HandleException(Exception ex)
{
// this will be run on the UI thread
}
static void Go(SynchronizationContext ui)
{
try
{
// ...
throw null; // The NullReferenceException will get caught below
// ...
}
catch (Exception ex)
{
ui.Send(state => HandleException(ex), null);
}
}
C#4.0が利用できない最小限の例です。 – user829174