Task Parallel нестабилен, время от времени использует 100% CPU

В настоящее время я тестирую Parallel для C #. Как правило, он работает нормально, и использование параллельного интерфейса выполняется быстрее, чем обычные циклы foreach. Тем не менее, время от времени (например, 1 из 5), мой процессор будет использовать 100%, в результате чего параллельные задачи будут очень медленными. Моя установка CPU - i5-4570 с оперативной памятью 8 ГБ. У кого-нибудь есть идеи, почему возникает эта проблема?

Ниже приведены коды, которые я использовал для проверки функции

            // Using normal foreach
            ConcurrentBag<int> resultData = new ConcurrentBag<int>();
            Stopwatch sw = new Stopwatch();
            sw.Start();
            foreach (var item in testData)
            {
                if (item.Equals(1))
                {
                    resultData.Add(item);
                }
            }
            Console.WriteLine("Normal ForEach " + sw.ElapsedMilliseconds);

            // Using list parallel for
            resultData = new ConcurrentBag<int>();
            sw.Restart();
            System.Threading.Tasks.Parallel.For(0, testData.Count() - 1, (i, loopState) =>
            {
                int data = testData[i];
                if (data.Equals(1))
                {
                    resultData.Add(data);
                }
            });
            Console.WriteLine("List Parallel For " + sw.ElapsedMilliseconds);

            // Using list parallel foreach
            //resultData.Clear();
            resultData = new ConcurrentBag<int>();
            sw.Restart();
            System.Threading.Tasks.Parallel.ForEach(testData, (item, loopState) =>
            {
                if (item.Equals(1))
                {
                    resultData.Add(item);
                }
            });
            Console.WriteLine("List Parallel ForEach " + sw.ElapsedMilliseconds);

            // Using concurrent parallel for 
            ConcurrentStack<int> resultData2 = new ConcurrentStack<int>();
            sw.Restart();
            System.Threading.Tasks.Parallel.For(0, testData.Count() - 1, (i, loopState) =>
            {
                int data = testData[i];
                if (data.Equals(1))
                {
                    resultData2.Push(data);
                }
            });
            Console.WriteLine("Concurrent Parallel For " + sw.ElapsedMilliseconds);

            // Using concurrent parallel foreach
            resultData2.Clear();
            sw.Restart();
            System.Threading.Tasks.Parallel.ForEach(testData, (item, loopState) =>
            {
                if (item.Equals(1))
                {
                    resultData2.Push(item);
                }
            });
            Console.WriteLine("Concurrent Parallel ForEach " + sw.ElapsedMilliseconds);
Нормальный выход

Нормальный ForEach 493

Параллельный список для 315

Параллельный список ForEach 328

Параллельная параллель для 286

Параллельная параллельная ForEach 292

При 100% загрузке процессора

Нормальный ForEach 476

Список параллельный для 8047

Параллельный список ForEach 276

Параллельная параллель для 281

Параллельная параллельная ForEach 3960

(Это может произойти во время любой из параллельных задач, выше только один случай)

Обновить

При использовании метода PLINQ, предоставляемого @willaien, и его 100-кратном запуске, эта проблема больше не возникает. Я до сих пор не знаю, почему эта проблема возникнет в первую очередь.

var resultData3 = testData.AsParallel().Where(x => x == 1).ToList();

Ответы на вопрос(2)

Ваш ответ на вопрос