параллельное foreach странное поведение - PullRequest
0 голосов
/ 17 апреля 2019

У меня есть код, который более или менее запускает следующую конструкцию - и когда ParallelRunner получает делегатную функцию testFunc, он зависает, однако, если вместо предоставления делегата я пишу функцию явно в методе ParallelRunner, она работает нормально.

Обратите внимание, что этот точный метод тестирования работает, но очень похожий код, работающий под IIS (в фоновом потоке), завершается неудачно, и как только я удаляю делегат testFunc и явно пишу его код в ParallelRunner, или даже вызываю TestCondition напрямую (безделегат) все работает нормально.

Есть идеи, что может вызвать это странное поведение?

  interface I { }

        class A : I { }
        class B :I { }

        [TestMethod]
        public void TestParallelWithDelegate()
        {
            var list = new List<I>();

            for (int i = 0; i < 300000; i++)
            {
                if (i % 2 == 0)
                {
                    list.Add(new A());

                }
                else
                {
                    list.Add(new B());
                }


            }

            var bag = new ConcurrentBag<I>();

            Func<I, bool> testFunc = TestCondition;

            ParallelRunner(list,bag,testFunc);

            Console.WriteLine($"terminated with delegate bag size = {bag.Count}");

        }
        private static bool TestCondition(I i)
        {
            return !(i is A);
        }


        void ParallelRunner(List<I> list, ConcurrentBag<I> bag, Func<I,bool> testFunc = null)
        {
            Parallel.ForEach(list, new ParallelOptions { MaxDegreeOfParallelism = Environment.ProcessorCount * 3 },
                x =>
                {
                    if (testFunc == null || testFunc(x))
                    {
                        bag.Add(x);

                    }
                });

        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...