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();
        }
    }
}

Извините, если повторил эту тему

0 ответов

Другие вопросы по тегам