У меня есть код, который более или менее запускает следующую конструкцию - и когда 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);
}
});
}