Jeśli używasz .NET 4. Są lepsze sposoby, aby to zrobić z Tasks
, ale zakładając, że trzeba użyć Threads
...
Jeśli przykładem jest aplikacja konsoli, wówczas Główna metoda wyjdzie , prawdopodobnie przed wykonaniem Go
. Więc twój "główny wątek" może nie istnieć, gdy zostanie zgłoszony wyjątek. Aby to zatrzymać, potrzebujesz synchronizacji.
Coś jak to powinno zrobić:
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;
}
}
Jeśli jest to aplikacja UI, rzeczy są nieco łatwiejsze. Będziesz musiał podać jakieś odwołanie do swojego wątku UI w metodzie Go
, aby wiedział, gdzie wysłać wyjątek. Najlepszym sposobem na to jest przekazanie SynchronizationContext
wątku interfejsu użytkownika.
Coś jak to będzie działać:
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 nie jest dostępny – user829174