NHibernate数据访问而不冻结GUI

时间:2012-01-24 08:36:01

标签: .net winforms nhibernate user-interface

我正在使用一个使用NHibernate作为ORM的Windows窗体应用程序。我们通常的模式看起来像:

  1. 从数据库获取对象图并填充GUI
  2. 让用户在GUI中编辑数据
  3. 将对象图表保存回数据库
  4. 这个工作单元的概念要求NHibernate会话只要用户编辑数据并点击“保存”按钮就可以生存。因此,我们的会话将作为步骤1的一部分进行实例化,并作为步骤3的一部分进行处理。

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

    我怎样才能最好地解决这个问题?

1 个答案:

答案 0 :(得分: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();
}