Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Castle ActiveRecord:会话错误搜索和访问不同线程中的延迟加载属性_C#_Multithreading_Castle Activerecord - Fatal编程技术网

C# Castle ActiveRecord:会话错误搜索和访问不同线程中的延迟加载属性

C# Castle ActiveRecord:会话错误搜索和访问不同线程中的延迟加载属性,c#,multithreading,castle-activerecord,C#,Multithreading,Castle Activerecord,在C#中使用Castle ActiveRecord的多线程桌面应用程序出现问题: 为了在基于用户输入搜索对象时保持GUI的活动性,我使用了BackgroundWorker的搜索功能。对象的某些属性,特别是一些具有许多-关系的属性,被标记为惰性 现在,当搜索完成并且用户选择结果对象时,应该显示该对象的一些属性。但是由于搜索是由BackgroundWorker在不同的线程中完成的,因此访问属性失败,因为用于延迟访问的会话不再可用 在额外线程中执行搜索以保持GUI活动并正确访问所有属性(包括标记为懒惰

在C#中使用Castle ActiveRecord的多线程桌面应用程序出现问题:

为了在基于用户输入搜索对象时保持GUI的活动性,我使用了
BackgroundWorker
的搜索功能。对象的某些属性,特别是一些
具有许多
-关系的属性,被标记为
惰性

现在,当搜索完成并且用户选择结果对象时,应该显示该对象的一些属性。但是由于搜索是由
BackgroundWorker
在不同的线程中完成的,因此访问属性失败,因为用于延迟访问的会话不再可用

在额外线程中执行搜索以保持GUI活动并正确访问所有属性(包括标记为懒惰的属性)的最佳方法是什么

谢谢你的建议

问候 sc911有几个选项:

  • 查询时,在主线程中对稍后需要的任何内容进行快速加载,从而避免延迟加载
  • 用于将实体重新附着到主线程中的ISession

通过这篇漂亮的博文解决了这个问题:

急切加载:这里有点问题,因为搜索结果是多个对象,用户只能从中选择一个。并且只需要此选定对象的属性。但是搜索和选择在不同的线程中。。。ISession.Lock():未能使此功能正常工作,抱歉!有没有关于如何使用它的示例?@sc911:re lock(),请参阅ActiveRecord已经包含了一个每线程会话范围存储:正如在博客文章中所述,该存储无法解决此特殊问题。我试图使用它,但后来我得到了一个好消息,旧的
未能惰性地初始化角色集合:[……],没有会话或会话被关闭
错误再次出现。如果我理解正确,那篇博文上的代码是跨线程共享会话,对吗?NHibernate会话不是线程安全的,我建议坚持ActiveRecord中包含的每线程策略。请尝试使用session.lock()将从后台线程获得的实体重新附加到前台线程的会话