【发布时间】:2016-02-09 14:46:37
【问题描述】:
以下是我在 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);
}
我的问题是 - 如果要在内部匿名 async Func<EmailToSend, Task<SendMailResult>> 中引发异常(最有可能在调用 MailHelper.SendMailAsync() 时),那么 AggregateException 处理程序将被调用 - 以下 .ToList()是否在任何时候被调用过?
换句话说,是否有可能某些任务成功完成,直到一个没有成功完成,并且在被 AggregateException 处理程序捕获后按照下面的代码 sn-p,我可能有一个非 0 计数的结果列表?或者异常是否意味着永远不会调用 ToList(),如果抛出异常,resultList 将始终为空?
我意识到我正在使用这种多线程功能与鲨鱼一起游泳,而没有完全了解它的含义。因此问题!谢谢。
【问题讨论】:
标签: c# .net multithreading plinq