c# – 捕获异步操作中的异常
发布时间:2020-12-15 03:58:40 所属栏目:百科 来源:网络整理
导读:我正在阅读更多关于异步在这里: http://msdn.microsoft.com/en-us/library/hh873173(v=vs.110).aspx 通过这个例子: Taskbool [] recommendations = …;while(recommendations.Count 0){ Taskbool recommendation = await Task.WhenAny(recommendations); t
我正在阅读更多关于异步在这里:
http://msdn.microsoft.com/en-us/library/hh873173(v=vs.110).aspx
通过这个例子: Task<bool> [] recommendations = …; while(recommendations.Count > 0) { Task<bool> recommendation = await Task.WhenAny(recommendations); try { if (await recommendation) BuyStock(symbol); break; } catch(WebException exc) { recommendations.Remove(recommendation); } } 我想知道,如果我已经在等待Task.WhenAny为什么我需要等待再次尝试块? 如果我已经这样做:任务< bool>推荐=等待任务. 解决方法
第一个等待存在异步等待第一个任务完成(即推荐).
第二个等待仅在于从已经完成的任务中提取实际结果,并抛出存储在任务中的异常. (重要的是要记住,等待完成的任务被优化并将同步执行). 获取结果的另一种选择将是使用Task< T> .Result,但是它在处理异常的方式上是不同的.等待将抛出实际异常(例如WebException),而Task< T> .Result将抛出一个包含实际异常的AggregateException. Task<bool> [] recommendations = …; while(recommendations.Count > 0) { Task<bool> recommendation = await Task.WhenAny(recommendations); try { if (recommendation.Result) { BuyStock(symbol); } break; } catch(AggregateException exc) { exc = exc.Flatten(); if (exc.InnerExceptions[0] is WebException) { recommendations.Remove(recommendation); } else { throw; } } } 显然,等待任务更简单,所以它是从任务中检索结果的推荐方法. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |