C# 并行编程避坑指南之-Try Catch系列

文章讨论了在.NETFramework4.5及更高版本中,Task相对于Thread的使用优势,指出Thread抛出异常可能导致应用程序崩溃,需正确使用try-catch块。示例展示了如何在Thread中正确处理异常,强调Thread适用于长时间运行的任务,而Task因其线程池管理和高性能API而更便于使用。
摘要由CSDN通过智能技术生成

自从.NET Framework 4.5+(含4.5)提供了Task开启线程后,基本上Thread的使用频率就大幅度降低了,但是一些老项目,或者老程序还是习惯用Thread去做,如果一定要使用Thred,那我们就必须在代码中使用try、catch块去处理异常的。

因为Thred的代码抛出异常将会是的应用程序被强制关闭,如果要避免这种情况的发生,就需要正确编写try/catch代码块。

错误的写法如下:

staticvoidMain()        {try            {var thread = new Thread(new ThreadStart(BadThread));                thread.Start();            }catch (Exception ex)            {                Console.WriteLine("you can not catch exception here!");            }            Console.ReadKey();        }privatestaticvoidBadThread()        {            Console.WriteLine("A faulty thread started...");            Thread.Sleep(100);thrownew Exception("Faulted!!!");        }

运行后直接崩溃了,如下图所示:

try catch应该放置到代码块内部去捕获异常。

正确的做法应该这样:

staticvoidMain()        {var thread = new Thread(CorrectThread);            thread.Start();            thread.Join();            Console.WriteLine("A faulty thread started...");            Console.ReadKey();        }privatestaticvoidCorrectThread()        {try            {                Console.WriteLine("A faulty thread started...");                Thread.Sleep(100);thrownew Exception("Faulted!!!");            }catch (Exception ex)            {                Console.WriteLine($"Exception handled : {ex}");            }        }

总结:就个人而言,目前是能用task尽量不用thread,那thread没有用武之地吗,也不是。thread适合长时间运行的线程,task呢,小巧玲珑,它是通过线程池实现的,不用的时候可以自动回收,使用起来很方便。thread默认为前台线程,主程序必须等线程跑完才会关闭,但是可以通过设置IsBackground,设置为后台线程,而threadpool则默认是后台线程,Task由于是用线程池实现的本地队列,性能优越,同时Task提供了丰富的API来管理线程、控制。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值