c#中的多线程异常 (转载)
1.对于Thread操作的异常处理
public static void Main() { try { Thread th = new Thread(DoWork); th.Start(); } catch (Exception ex) { // Non-reachable code Console.WriteLine("Exception!"); } } static void DoWork() { …… throw null; // Throws a NullReferenceException }
在DoWork函数里抛出的异常时不会被主线程的try,catch捕捉的,各个线程应该有自己的try,catch去处理线程异常。
正确写法:
public static void Main() { Thread th = new Thread(DoWork); th.Start(); } static void DoWork() { try { …… throw null; // The NullReferenceException will be caught below } catch (Exception ex) { Typically log the exception, and/ or signal another thread that we've come unstuck ... } }
2. 异步函数的异常处理
例如如 WebClient中的 UploadStringAsync,它的异常会在UploadStringCompleted的参数error里
static void Main(string[] args) { WebClient webClient = new WebClient(); webClient.UploadStringCompleted += new UploadStringCompletedEventHandler((sender, e) => { if (e.Error != null) { Console.WriteLine(e.Error.Message); } }); webClient.UploadStringAsync(new Uri("http://www.baidu.com"), "1111"); Console.ReadKey(); }
3 Task的异常处理
把try包含task.wait()函数,就能捕捉task的异常
Task task = Task.Run(() => { throw null; }); try { task.Wait(); } catch (AggregateException aex) { if (aex.InnerException is NullReferenceException) Console.WriteLine("Null!"); else throw; }
或者 在continue函数里处理TaskContinuationOptions.OnlyOnFaulted的状态
Task<List<int>> taskWithFactoryAndState = Task.Factory.StartNew<List<int>>((stateObj) => { List<int> ints = new List<int>(); for (int i = 0; i < (int)stateObj; i++) { ints.Add(i); if (i > 100) { InvalidOperationException ex = new InvalidOperationException("oh no its > 100"); ex.Source = "taskWithFactoryAndState"; throw ex; } } return ints; }, 2000); //and setup a continuation for it only on when faulted taskWithFactoryAndState.ContinueWith((ant) => { AggregateException aggEx = ant.Exception; Console.WriteLine("OOOOPS : The Task exited with Exception(s)"); foreach (Exception ex in aggEx.InnerExceptions) { Console.WriteLine(string.Format("Caught exception '{0}'", ex.Message)); } }, TaskContinuationOptions.OnlyOnFaulted); //and setup a continuation for it only on ran to completion taskWithFactoryAndState.ContinueWith((ant) => { List<int> result = ant.Result; foreach (int resultValue in result) { Console.WriteLine("Task produced {0}", resultValue); } }, TaskContinuationOptions.OnlyOnRanToCompletion); Console.ReadLine();
4 c# 5.0 中的async ,await 异常捕捉
static async Task ThrowAfter(int timeout, Exception ex) { await Task.Delay(timeout); throw ex; } static async Task MissHandling() { var t1 = ThrowAfter(1000, new NotSupportedException("Error 1")); try { await t1; } catch (NotSupportedException ex) { Console.WriteLine(ex.Message); } }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架
2016-01-29 Sqlserver Sql Agent Job 只能同时有一个实例运行