Все,
Я использую 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 занимает довольно много времени (около 4 с на вызов).Таким образом, среднее время для этого в обычном 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;
}