在WPF应用程序中混合使用NHibernate会话线程

时间:2011-08-10 14:18:34

标签: wpf multithreading nhibernate repository

我正在创建具有丰富前端的WPF应用程序。我从一开始就运行的问题是,只要用户更改过滤器,UI就会锁定。我最初通过在BackgroundWorker中使用NHibernate查询数据库来修复此问题。它在短时间内运行良好,但NHibernate经常抛出各种异常,例如抱怨会话已经打开。

如何在WPF应用程序中混合使用NHibernate会话和线程?

我正在考虑因为我将一个开放的ISession实例注入我的存储库并在几个不同的线程中使用该存储库,我可能最好只需注入ISessionFactory而打开一个新的我的存储库函数中的会话。

更新

正在使用此BackgroundWorker的方案是用户可以选择多个角色中的一个。每次检查或取消选中角色时,我都会使用后台工作程序来查询数据库。如果你检查两个角色真的很快,那么NHibernate抛出一个异常,说会话已经在使用,因为它仍在尝试获取第一个检查动作的数据。

基本上,如果NHIbernate已经在运行查询然后取消它并开始执行新查询,那么检测它会很好。这是有道理的,因为如果用户选择2个角色(因此需要2个查询),那么第一个查询将不再有效。

有什么想法吗?

1 个答案:

答案 0 :(得分:1)

您需要确保每个线程有一个会话。您无法跨多个线程传播会话。当您启动后台线程时,请创建一个新会话。当您不再需要该线程时,将其终止并关闭该会话。