每当我的线程池中的一个线程抛出异常时,我的代码似乎会卡在线程函数内的 catch 块。我该如何将异常传回主线程?
不可能直接将异常从一个线程传递到另一个线程。您可以构建一些同步机制,在线程之间传递异常信息,然后在目标线程中抛出新的异常,例如:
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窗体应用程序,那么事情就简单得多了。在线程的catch子句中使用您窗体的Invoke(或BeginInvoke)方法,提供异常详细信息。在使用Invoke启动的方法中,您可以重新抛出或按照您想要的方式处理异常。