dotnet 记 TaskCompletionSource 的 SetException 可能将异常记录到 UnobservedTaskException 的问题
最简的复现步骤是如下代码
public App()
{
TaskScheduler.UnobservedTaskException += TaskSchedulerOnUnobservedTaskException;
var taskCompletionSource = new TaskCompletionSource();
taskCompletionSource.SetException(new Exception());
}
private void TaskSchedulerOnUnobservedTaskException(object? sender, UnobservedTaskExceptionEventArgs e)
{
}
以上是一个 WPF 应用,选 WPF 应用是可以比较方便等待 GC 的触发
以上代码将创建一个 TaskCompletionSource 对象,且此对象的 Task 没有地方等待,意味着在 SetException 设置的异常,将会设置到一个未等待的 Task 上。按照 dotnet 的设计,如果一个 Task 存在未捕获的异常,将会在 Task 被回收的时候,进入 TaskScheduler.UnobservedTaskException 事件
进入 TaskScheduler.UnobservedTaskException 事件的异常,按照设计,在 .NET Framework 4.5 之后,也就是包含所有的 dotnet core 版本,都不会导致应用崩溃。进入 TaskScheduler.UnobservedTaskException 事件的异常,只是用来告诉开发者,某个地方也许存在一个小坑
规避方法是: 无视;找个好地方等待一下 Task 对象;不要 SetException 方法,而是换成 SetResult 方法
博客园博客只做备份,博客发布就不再更新,如果想看最新博客,请访问 https://blog.lindexi.com/
如图片看不见,请在浏览器开启不安全http内容兼容

本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。欢迎转载、使用、重新发布,但务必保留文章署名[林德熙](https://www.cnblogs.com/lindexi)(包含链接:https://www.cnblogs.com/lindexi ),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。如有任何疑问,请与我[联系](mailto:lindexi_gd@163.com)。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
2020-09-05 dotnet 在 UOS 国产系统上使用 MonoDevelop 创建 GTK 全平台带界面应用
2020-09-05 dotnet 在 UOS 国产系统上使用 MonoDevelop 进行拖控件开发 GTK 应用
2020-09-05 dotnet 在 UOS 国产系统上安装 MonoDevelop 开发工具
2020-09-05 dotnet 在 UOS 国产系统上使用 Xamarin Forms 创建 xaml 界面的 GTK 应用
2020-09-05 dotnet 在 UOS 国产系统上安装 dotnet sdk 的方法
2020-09-05 dotnet 在国产 UOS 系统利用 dotnet tool 工具做文件传输