Если вы используете .NET 4 Есть лучшие способы сделать это с Tasks
, но при условии, что вам нужно использовать 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;
}
}
Если это приложение пользовательского интерфейса, все немного проще. Вам нужно будет передать некоторую ссылку на ваш поток пользовательского интерфейса в метод Go
, чтобы он знал, куда отправить исключение. Лучший способ сделать это - передать 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