c# – PLINQ查询中的评估顺序是什么?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了c# – PLINQ查询中的评估顺序是什么?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1593字,纯文字阅读大概需要3分钟。
内容图文
下面是我在Windows服务中定期运行的PLINQ查询示例:
var resultList = new List<Task<SendMailResult>>();
try
{
resultList = emailsToSend
.AsParallel().WithDegreeOfParallelism(10)
.Select(async e =>
{
bool bSuccess = false;
if (await MailHelper.SendMailAsync(e.sTo, e.sSubject, e.sHTML) == true)
{
bSuccess = true;
}
return new SendMailResult
{
succeeded = bSuccess,
resultid = e.id
};
}).ToList();
Task.WaitAll(resultList.ToArray());
}
catch (AggregateException aggEx)
{
foreach (var ex in aggEx.InnerExceptions)
Console.Out.WriteLine(ex.Message);
}
我的问题是 – 如果在内部匿名异步Func< EmailToSend,Task< SendMailResult>>中抛出异常. (虽然很可能调用MailHelper.SendMailAsync()),然后调用AggregateException处理程序 – 是否会在任何时候调用以下.ToList()?
换句话说,是否有可能某些任务成功完成,直到一个没有完成,并且在被捕获到AggregateException处理程序之后跟随下面的代码片段,我可能有一个非0计数的resultList?或者一个异常意味着永远不会调用ToList(),如果抛出异常,resultList将始终为空?
我意识到我正在和鲨鱼游泳,使用这种多线程的力量而不完全了解它的含义.因此问题!谢谢.
解决方法:
由于Select laziness,任何时候都会调用.ToList(),结果列表将包含所有任务.
执行将以.ToList()方法调用开始. Select将仅提供可枚举的IEnumerable列表.
如果某些任务会因异常而失败,您将捕获它们,毕竟您将获得任务列表,其中某些任务将具有“故障”状态.
编辑:
异常抛出将由Task.WaitAll方法调用触发,因此将在之前创建列表,并将精确项目计为初始集合.
更新:
关于Task.WaitAll内部结构:
如果你想知道它是如何工作的,你可以看看source code.
首先是collects all incompleted tasks然后是waits,完成这些任务.
之后它从所有任务中获取collects all inner exceptions,然后将其作为单个AggregateException引发.
内容总结
以上是互联网集市为您收集整理的c# – PLINQ查询中的评估顺序是什么?全部内容,希望文章能够帮你解决c# – PLINQ查询中的评估顺序是什么?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。