Castle ActiveRecord: поиск ошибок сеанса и доступ к свойству ленивой загрузки в разных потоках

У меня возникла проблема с многопоточным настольным приложением, использующим Castle ActiveRecord на C#:

Чтобы поддерживать работу графического интерфейса при поиске объектов на основе пользовательского ввода, я использую BackgroundWorker для функции поиска. Некоторые свойства объектов, особенно некоторые HasMany-отношения, отмечены как Lazy.

Теперь, когда поиск завершен и пользователь выбирает результирующий объект, должны отображаться некоторые свойства этого объекта. Но поскольку поиск был выполнен BackgroundWorker в другом потоке, доступ к свойствам завершился неудачей, поскольку сеанс для отложенного доступа больше не доступен.

Каким будет лучший способ выполнить поиск в дополнительном потоке, чтобы сохранить графический интерфейс и правильно получить доступ ко всем свойствам, включая те, которые помечены как ленивые?

Спасибо за любой совет!

С уважением sc911


person sc911    schedule 10.05.2010    source источник


Ответы (2)


Пара вариантов:

  • При запросе выполняйте активную загрузку всего, что вам понадобится позже в основном потоке, избегая таким образом ленивой загрузки.
  • Используйте ISession.Lock() для повторного присоединения объектов. к ISession в основном потоке.
person Mauricio Scheffer    schedule 10.05.2010
comment
нетерпеливая загрузка: здесь есть проблема, потому что поиск приводит к нескольким объектам, из которых пользователь выбирает только один. и требуются только свойства этого выбранного. но поиск и выбор находятся в разных потоках... ISession.Lock(): не получилось, извините! какие-нибудь примеры, как его использовать? - person sc911; 11.05.2010
comment
@sc911: re lock(), см. intellect.dk /сообщить/ - person Mauricio Scheffer; 11.05.2010

Решил это с помощью этого приятного сообщения в блоге здесь: http://www.darkside.co.za/archive/2008/09/09/castle-activerecord-lazy-loading-session-scopes-again.aspx

person sc911    schedule 11.05.2010
comment
ActiveRecord уже включает хранилище SessionScope для каждого потока: github.com/castleproject/Castle.ActiveRecord/blob/master/src/ - person Mauricio Scheffer; 11.05.2010
comment
который, как указано в сообщении в блоге, не работает для этой специальной проблемы. Я пытался использовать его, но потом снова получаю старую милую ошибку failed to lazily initialize a collection of role: [...], no session or session was closed. - person sc911; 11.05.2010
comment
Если я правильно понимаю, код в этом сообщении в блоге разделяет сеансы между потоками, верно? Сеансы NHibernate не являются потокобезопасными, я рекомендую придерживаться стратегии для каждого потока, включенной в ActiveRecord. - person Mauricio Scheffer; 11.05.2010
comment
Попробуйте повторно прикрепить объекты, которые вы получили из фонового потока, к сеансу потока переднего плана, используя session.lock() - person Mauricio Scheffer; 11.05.2010