2012-01-24 36 views
2

我正在使用NHibernate作为ORM的Windows窗体应用程序。我们通常的模式看起来是这样的:从数据库不冻结的NHibernate数据访问GUI

  1. 获取对象图和填充GUI
  2. 让GUI用户编辑数据
  3. 保存对象图回数据库

的单位 - 这个概念只要需要用户编辑数据并点击保存按钮,NHibernate会话才会生效。因此,我们的会话实例化为步骤1的一部分,并作为步骤3的一部分进行处理。

现在,我想在保存操作期间显示不确定的进度条动画。因此,会话不能在GUI线程中生存,因为如果保存需要时间,会导致动画冻结。

我该如何最好地解决这个问题?

回答

4

最简单的解决方案是分拆后台工作:

BackgroundWorker _worker; 

void OnSaveButtonClicked(...) 
{ 
    // Update your entities with the data entered by the user, e.g.: 
    _settings.UserName = textBoxUserName.Text 

    _worker = new BackgroundWorker(); 
    _worker.WorkerCompleted += (s, e) => { /* Saving completed, 
               hide progress bar */ }; 
    _worker.DoWork += (s, e) => 
    { 
     _session.SaveOrUpdate(_settings); 
    }; 

    // Show progress bar: 
    // progressBar.Show...  

    _worker.RunWorkerAsync(); 
} 
+0

但是,这意味着该SaveOrUpdate方法是从一个线程池线程,而不是线程该会议被实例化调用,不它? –

+0

@TormodFjeldskår:对。那是问题吗? –

+0

是的,这是一个问题。从文档:“ISession不是线程安全的!不要在两个并发线程中访问同一个ISession,一个ISession通常只是一个工作单元!”参考文献:http://www.nhforge.org/doc/nh/en/index.html#transactions-threads –