Parallels.ForEach занимает то же время, что и Foreach

Все,

Я использую Parallels.ForEach следующим образом

private void fillEventDifferencesParallels(IProducerConsumerCollection<IEvent> events, Dictionary<string, IEvent> originalEvents)
    {
        Parallel.ForEach<IEvent>(events, evt =>
        {
            IEvent originalEventInfo = originalEvents[evt.EventID];
            evt.FillDifferences(originalEventInfo);
        });
    }

Итак, проблема в том, что у меня есть список из 28 таких событий (тестовый образец, он должен быть способен масштабироваться до 200+) и метод FillDifferences занимает довольно много времени (около 4s на вызов). Таким образом, среднее время выполнения этого метода в обычном ForEach составляет около 100-130 с. Когда я запускаю то же самое в параллельном режиме, это занимает столько же времени и перегружает мой процессор (Intel I5, 2 ядра, 2 потока на ядро), вызывая заторможенность приложения во время выполнения этого запроса (он выполняется в потоке, порожденном потоком GUI).

Итак, мой вопрос в том, что я делаю неправильно, из-за чего это занимает одинаковое количество времени? Я читал, что List не является потокобезопасным, поэтому я переписал его, чтобы использовать IProducerConsumerCollection. Есть ли еще какие-нибудь подводные камни, которые могут быть причиной этого?

Метод FillDifferences вызывает статический класс, который использует отражение, чтобы выяснить, сколько различий существует между исходным и измененным объектом. Статический объект не имеет "глобальных" переменных, только локальные для вызываемых методов.

Некоторые из вас хотели посмотреть, как вызывается метод FillDifferences(). Вот где он заканчивается в конечном итоге:

  public  List<IDifferences> ShallowCompare(object orig, object changed, string currentName)
    {
        List<IDifferences> differences = new List<IDifferences>();
        foreach (MemberInfo m in orig.GetType().GetMembers())
        {
            List<IDifferences> temp = null;

            //Go through all MemberInfos until you find one that is a Property.
            if (m.MemberType == MemberTypes.Property)
            {
                PropertyInfo p = (PropertyInfo)m;
                string newCurrentName = "";
                if (currentName != null && currentName.Length > 0)
                {
                    newCurrentName = currentName + ".";
                }
                newCurrentName += p.Name;
                object propertyOrig = null;
                object propertyChanged = null;

                //Find the property Information from the orig object
                if (orig != null)
                {
                    propertyOrig = p.GetValue(orig, null);
                }

                //Find the property Information from the changed object
                if (changed != null)
                {
                    propertyChanged = p.GetValue(changed, null);
                }

                //Send the property to find the differences, if any. This is a SHALLOW compare.
                temp = objectComparator(p, propertyOrig, propertyChanged, true, newCurrentName);
            }
            if (temp != null && temp.Count > 0)
            {
                foreach (IDifferences difference in temp)
                {
                    addDifferenceToList(differences, difference);
                }
            }
        }
        return differences;
    }
10
задан Henk Holterman 28 November 2011 в 23:32
поделиться