C#, parrallel.foreach не может обработать AggregateException с файлами и полным циклом
У меня проблема в моем любимом проекте. В общем, я хочу посчитать файлы в некотором каталоге, отфильтровав их по некоторым параметрам (длина). Это работает хорошо для меня, когда происходит "чтение" файлов или каталогов, где у меня есть доступ. В противномслучае это сломало мой цикл. Например, для обработки AggregateException я использовал msdn https://msdn.microsoft.com/en-us/library/dd460695(v=vs.110).aspx (этот пример хорошо работает)
Я получил исключение при первом вызове недоступного файла. Не могли бы вы порекомендовать лучший способ выполнить мое требование? Ниже вы можете увидеть мой код.
using System;
using System.Collections.Concurrent;
using System.Diagnostics;
using System.Globalization;
using System.IO;
using System.Linq;
using System.Threading.Tasks;
namespace app
{
class Program
{
public static int CountOfGetAccessFiles { get; set; }
public static int NotCountOfGetAccessFiles { get; set; }
public static void ToDo()
{
//get files
DirectoryInfo dir = new DirectoryInfo(@"E:\");
var str = dir.EnumerateFiles("*.*", SearchOption.AllDirectories);
var quantFiles = str.Select(x => x);
//need to save exceptions
var exceptions = new ConcurrentQueue<Exception>();
try
{
Parallel.ForEach(quantFiles, item =>
{
CountOfGetAccessFiles++;
Console.WriteLine(CountOfGetAccessFiles);
});
}
catch (Exception e)
{
NotCountOfGetAccessFiles++;
exceptions.Enqueue(e);
}
if (exceptions.Count > 0) throw new AggregateException(exceptions);
}
static void Main(string[] args)
{
try
{
ToDo();
}
catch (AggregateException ae)
{
//This is where you can choose which exceptions to handle.
foreach (var ex in ae.InnerExceptions)
{
if (ex is ArgumentException)
Console.WriteLine(ex.Message);
//else
// throw ex;
}
}
Console.WriteLine("Count {0}, aggregate {1}", CountOfGetAccessFiles, NotCountOfGetAccessFiles);
Console.ReadLine();
}
}
}
Извините, если повторил эту тему