微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

c# – 捕获异步操作中的异常

我正在阅读更多关于异步在这里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>推荐=等待任务.
为什么这样做:如果(等待推荐)BuyStock(符号);

解决方法

一个等待存在异步等待第一个任务完成(即推荐).
第二个等待仅在于从已经完成的任务中提取实际结果,并抛出存储在任务中的异常. (重要的是要记住,等待完成的任务被优化并将同步执行).

获取结果的另一种选择将是使用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;
        }
    }
}

显然,等待任务更简单,所以它是从任务中检索结果的推荐方法.

原文地址:https://www.jb51.cc/csharp/93101.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐