Task 编程中的异常处理
在 .Net 开发中, 使用 Task 、 Task<T> 进行异步编程是非常方便的, 但是在处理 Task 产生的异常时, 需要注意一个问题, 比如下面的代码:
1 2 3 4 5 6 7 8 9 10 11 12 | static Task< int > TestAsync( int a, int b) { var tcs = new TaskCompletionSource< int >(); Task.Factory.StartNew(() => { if (a + b < 0) { tcs.TrySetException( new InvalidOperationException( "a + b < 0" )); } else { tcs.TrySetResult(a + b); } }); return tcs.Task; } |
当输入的两个参数之和小于 0 时, tcs 会设置一个 InvalidOperationException , 如果直接运行这段代码, 当这个函数返回的 Task 被 GC 回收时, 将会产生 AggregateException was unhandled 的异常, 运行代码如下:
1 2 3 4 5 6 7 8 9 10 | static void Main( string [] args) { TestAsync(5, -10); Thread.Sleep(TimeSpan.FromMilliseconds(3000)); GC.Collect(); Console.WriteLine( "Completed." ); } |
当程序运行结束时, 会产生下图所示的异常:
关键的是这段文字:
A Task's exception(s) were not observed either by Waiting on the Task or accessing its Exception property. As a result, the unobserved exception was rethrown by the finalizer thread.
没有在等待 Task 完成时捕获其异常, 也没有读取 Task 的 Exception 属性, 结果导致异常被终结线程重新抛出。 也就是说, Task 异常有两种处理方式:
1、 调用 Task 的 Wait 方法时使用 try-catch 捕获异常:
1 2 3 4 5 6 7 | var testTask = TestAsync(5, -10); try { testTask.Wait(); } catch (Exception ex) { Console.WriteLine(ex); } |
2、 在 Task 的 ContinueWith 方法中读取 Task 的 Exception 属性:
1 2 3 4 5 6 7 8 9 | var testTask = TestAsync(5, -10); testTask.ContinueWith(task => { if (task.IsFaulted) { Console.WriteLine(task.Exception.GetBaseException()); } else { Console.WriteLine(task.Result); } }); |
在 .Net 4.0 、 Sliverlight 5.0 、以及 MonoTouch 中均有类似的问题, 因此, 必须小心翼翼的处理 Task 产生的异常, 否则将会导致你的程序异常退出。
张志敏所有文章遵循创作共用版权协议,要求署名、非商业 、保持一致。在满足创作共用版权协议的基础上可以转载,但请以超链接形式注明出处。
本博客已经迁移到 GitHub , 围观地址: https://beginor.github.io/
分类:
.Net Framework
, Refferences
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架