Si está utilizando .NET 4 hay mejores maneras de hacer esto con Tasks
, pero asumiendo que es necesario utilizar Threads
...
Si el ejemplo es una aplicación de consola, a continuación, su método principal saldrá , posiblemente antes de que Go
comience a ejecutarse. Por lo tanto, su "hilo principal" puede no existir cuando se lanza la excepción. Para detener esto, necesitas algo de sincronización.
Algo como esto debería hacer:
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;
}
}
Si se trata de una aplicación de interfaz de usuario, las cosas son un poco más fácil. Deberá pasar alguna referencia a su subproceso de interfaz de usuario en el método Go
para que sepa dónde enviar la excepción. La mejor manera de hacerlo es pasar el SynchronizationContext
del subproceso UI.
Algo como esto funcionarí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 no está disponible – user829174