У меня есть программа, которую мы хотели бы сделать многопоточной в определенный момент. Мы используем CSLA для наших бизнес-правил. В одном месте нашей программы мы перебираем объект BusinessList и выполняем некоторые проверки работоспособности данных по одной строке за раз. Когда мы увеличиваем количество строк примерно до 10 тыс. Строк, запуск процесса занимает некоторое время (около минуты). Естественно, это звучит как идеальное место, чтобы использовать немного TPL и сделать это многопоточным.
В течение многих лет я проделал немалую работу с многопоточностью, поэтому я понимаю подводные камни перехода от однопоточного кода к многопоточному. Я был удивлен, обнаружив, что код взорвался в самих процедурах CSLA. Похоже, это связано с кодом, лежащим в основе классов PropertyLfo CSLA.
Все наши свойства бизнес-объектов определены следующим образом:
public static readonly PropertyInfo<string> MyTextProperty = RegisterProperty<string>(c => c.MyText);
public string MyText {
get { return GetProperty(MyTextProperty); }
set { SetProperty(MyTextProperty, value); }
}
Что мне нужно знать о многопоточности и CSLA? Есть ли какие-либо предостережения, которые не найдены ни в одной письменной документации (пока я ничего не нашел).
- EDIT ---
Кстати: способ, которым я реализовал свою многопоточность, бросая все строки в ConcurrentBag, а затем порождая 5 или около того задач, которые просто захватывают объекты из сумки, пока сумка не опустеет. Поэтому я не думаю, что проблема в моем коде.