Многопоточность CSLA.NET - PullRequest
0 голосов
/ 08 февраля 2011

У меня есть программа, которую мы хотели бы сделать многопоточной в определенный момент. Мы используем 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 или около того задач, которые просто захватывают объекты из сумки, пока сумка не опустеет. Поэтому я не думаю, что проблема в моем коде.

1 Ответ

1 голос
/ 28 февраля 2011

Как вы обнаружили, платформа CSLA.NET не является поточно-ориентированной.

Для решения вашей конкретной проблемы я бы использовал библиотеку Wintellect Power Threading ;либо AsyncEnumerator / SyncGate, либо ReaderWriterGate самостоятельно.

Библиотека Power Threading позволит вам ставить запросы на чтение и запись в общий ресурс (вашу коллекцию CSLA.NET).В какой-то момент времени только один запрос «записи» будет разрешен доступ к общему ресурсу, и все без потоковой блокировки запросов «чтения» или «записи» в очереди.Это очень умный и очень удобный для безопасного доступа к общим ресурсам из нескольких потоков.Вы можете раскрутить столько потоков, сколько пожелаете, и библиотека Power Threading синхронизирует доступ к вашей коллекции CSLA.NET.

...