我正在创建具有丰富前端的WPF应用程序。我从一开始就运行的问题是,只要用户更改过滤器,UI就会锁定。我最初通过在BackgroundWorker
中使用NHibernate查询数据库来修复此问题。它在短时间内运行良好,但NHibernate经常抛出各种异常,例如抱怨会话已经打开。
如何在WPF应用程序中混合使用NHibernate会话和线程?
我正在考虑因为我将一个开放的ISession
实例注入我的存储库并在几个不同的线程中使用该存储库,我可能最好只需注入ISessionFactory
而打开一个新的我的存储库函数中的会话。
正在使用此BackgroundWorker
的方案是用户可以选择多个角色中的一个。每次检查或取消选中角色时,我都会使用后台工作程序来查询数据库。如果你检查两个角色真的很快,那么NHibernate抛出一个异常,说会话已经在使用,因为它仍在尝试获取第一个检查动作的数据。
基本上,如果NHIbernate已经在运行查询然后取消它并开始执行新查询,那么检测它会很好。这是有道理的,因为如果用户选择2个角色(因此需要2个查询),那么第一个查询将不再有效。
有什么想法吗?
答案 0 :(得分:1)
您需要确保每个线程有一个会话。您无法跨多个线程传播会话。当您启动后台线程时,请创建一个新会话。当您不再需要该线程时,将其终止并关闭该会话。