多线程(7)多线程中的异常处理
多线程使用过程中,除了线程同步的问题要考虑外,异常处理也是经常要面对的事情。
默认主线程捕获不到异步线程的异常
如下代码:

View Code常用的异常处理方法
1,在异步线程内部使用try/catch
如下代码:

View Code运行结果:

2,调用Task的Wait方法
如下代码:

注意:
除了调用Task的Wait方法后,在主线程可以捕获异常外,对于有返回值的Task,只要接收了它的返回值就不再需要调用Wait方法了。
View Code
运行结果:

3,在Task的ContinueWith方法中读取Task的Exception属性
如下代码:

View Code
运行结果:

4,全局设置TaskScheduler.UnobservedTaskException
如果异步线程里的异常没有被处理,也没有调用Task.Wait方法将异常传给主线程处理,最严重的后果可能会导致整个应用程序奔溃。详细原因参考:System.Threading.Tasks.Task引起的IIS应用程序池崩溃
所以,为了保证应用程序不会因为异步线程的异常未被处理导致挂掉,推荐的做法是,全局设置TaskScheduler.UnobservedTaskException。
如果是web程序,可以在Global的Application_Start事件中进行设置,如下代码:

1 protected override void Application_Start(object sender, EventArgs e)
2 {
3 System.Threading.Tasks.TaskScheduler.UnobservedTaskException += (s, v) =>
4 {
5 v.SetObserved();
6 };
7 }
分类: C#基础
漫思

浙公网安备 33010602011771号