C#多线程异常处理(五)
我在从Task捕获异常时遇到问题.运行我更改了代码,问题解决了.我愿意找出以两种方式运行Task.Run中的异常之间的区别:
在Outside函数中,我无法捕获异常,但在Inside函数中,我可以捕获异常.
void Outside() { try { Task.Run(() => { int z = 0; int x = 1 / z; }); } catch (Exception exception) { MessageBox.Show("Outside : " + exception.Message); } } void Inside() { Task.Run(() => { try { int z = 0; int x = 1 / z; } catch (Exception exception) { MessageBox.Show("Inside : "+exception.Message); } }); }
解决方案
运行任务时,它所引发的任何异常都将保留,并在某些等待任务结果或任务完成的情况下重新抛出. >
Task.Run()返回一个可用于执行此操作的Task对象,因此:
var task = Task.Run(...) try { task.Wait(); // Rethrows any exception(s). ...
对于较新版本的C#,您可以使用await而不是Task.Wait():
try { await Task.Run(...); ...
整整齐齐.
为完整起见,这是一个可编译的控制台应用程序,演示了await的用法:
using System; using System.Threading; using System.Threading.Tasks; namespace ConsoleApp1 { class Program { static void Main() { test().Wait(); } static async Task test() { try { await Task.Run(() => throwsExceptionAfterOneSecond()); } catch (Exception e) { Console.WriteLine(e.Message); } } static void throwsExceptionAfterOneSecond() { Thread.Sleep(1000); // Sleep is for illustration only. throw new InvalidOperationException("Ooops"); } } }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
2020-08-26 类图(UML)
2020-08-26 协作图(通信图)
2020-08-26 时序图(序列图)