C# Castle ActiveRecord:会话错误搜索和访问不同线程中的延迟加载属性
在C#中使用Castle ActiveRecord的多线程桌面应用程序出现问题: 为了在基于用户输入搜索对象时保持GUI的活动性,我使用了C# Castle ActiveRecord:会话错误搜索和访问不同线程中的延迟加载属性,c#,multithreading,castle-activerecord,C#,Multithreading,Castle Activerecord,在C#中使用Castle ActiveRecord的多线程桌面应用程序出现问题: 为了在基于用户输入搜索对象时保持GUI的活动性,我使用了BackgroundWorker的搜索功能。对象的某些属性,特别是一些具有许多-关系的属性,被标记为惰性 现在,当搜索完成并且用户选择结果对象时,应该显示该对象的一些属性。但是由于搜索是由BackgroundWorker在不同的线程中完成的,因此访问属性失败,因为用于延迟访问的会话不再可用 在额外线程中执行搜索以保持GUI活动并正确访问所有属性(包括标记为懒惰
BackgroundWorker
的搜索功能。对象的某些属性,特别是一些具有许多
-关系的属性,被标记为惰性
现在,当搜索完成并且用户选择结果对象时,应该显示该对象的一些属性。但是由于搜索是由BackgroundWorker
在不同的线程中完成的,因此访问属性失败,因为用于延迟访问的会话不再可用
在额外线程中执行搜索以保持GUI活动并正确访问所有属性(包括标记为懒惰的属性)的最佳方法是什么
谢谢你的建议
问候
sc911有几个选项:
- 查询时,在主线程中对稍后需要的任何内容进行快速加载,从而避免延迟加载
- 用于将实体重新附着到主线程中的ISession
急切加载:这里有点问题,因为搜索结果是多个对象,用户只能从中选择一个。并且只需要此选定对象的属性。但是搜索和选择在不同的线程中。。。ISession.Lock():未能使此功能正常工作,抱歉!有没有关于如何使用它的示例?@sc911:re lock(),请参阅ActiveRecord已经包含了一个每线程会话范围存储:正如在博客文章中所述,该存储无法解决此特殊问题。我试图使用它,但后来我得到了一个好消息,旧的
未能惰性地初始化角色集合:[……],没有会话或会话被关闭
错误再次出现。如果我理解正确,那篇博文上的代码是跨线程共享会话,对吗?NHibernate会话不是线程安全的,我建议坚持ActiveRecord中包含的每线程策略。请尝试使用session.lock()将从后台线程获得的实体重新附加到前台线程的会话