Невозможно перенести исключение из потока в другой. Что вы можете сделать, это создать некоторый механизм синхронизации для передачи информации об исключениях между потоками, а затем создать новое исключение из целевого потока, например:
class Program
{
Exception _savedException = null;
AutoResetEvent _exceptionEvent = new AutoResetEvent(false);
static void Main(string[] args)
{
Program program = new Program();
program.RunMain();
}
void RunMain()
{
ThreadPool.QueueUserWorkItem(new WaitCallback(ThreadMethod));
while (true)
{
_exceptionEvent.WaitOne();
if (_savedException != null)
{
throw _savedException;
}
}
}
void ThreadMethod(object contxt)
{
try
{
// do something that can throw an exception
}
catch (Exception ex)
{
_savedException = ex;
_exceptionEvent.Set();
}
}
}
Если у вас есть приложение Win form, все гораздо проще. В предложении catch вашего потока используйте метод Invoke (или BeginInvoke) вашей формы, предоставив в нем детали исключения. В методе, запущенном с Invoke, вы можете перебрасывать или обрабатывать свое исключение так, как хотите.