2

我正在开发一个使用 SQL Compact 作为主数据库的 WinForms 应用程序。有人告诉我我永远不会弄乱 UI 线程,每个操作都需要在 UI 线程之外完成。通过这个演讲为每个 CRUD 操作创建一个线程并出现一个进度条,但我认为这可能不是最好的方法,我很不确定何时何地使用线程以及数据库操作。我没有使用 UI 线程来进行这些数据库调用,但如果我愿意的话,我没有看到任何问题。为了向用户显示信息,我在需要时进行调用(在网格或组合框中显示数据)。这是一小段代码:

this.SuspendLayout();

                ProgressDialog progressDialog = new ProgressDialog();


                Thread backgroundThread = new Thread(
                    new ThreadStart(() =>
                    {
                        var unitOfWork = new DAL.Implementations.Entity_Framework.UnitOfWork<dbgmEntities>();
                        var espacosRepository = unitOfWork.GetRepository<DAL.Espacos>();
                        Espacos espaco;

                        if (e.Row.Cells["ESP_Descr"].Value != null)
                            espaco = new Espacos { ESP_Nome = e.Row.Cells["ESP_Nome"].Value.ToString(), ESP_Descr = e.Row.Cells["ESP_Descr"].Value.ToString() };

                        else
                            espaco = new Espacos { ESP_Nome = e.Row.Cells["ESP_Nome"].Value.ToString() };


                        espacosRepository.AddOrAttach(espaco);
                        unitOfWork.Save();

                    }
              ));


                backgroundThread.Start();
                progressDialog.Show();
                progressDialog.Close();
                this.ResumeLayout();

我正在使用带有 SQL Compact 和 Entity Framework 4.0 的存储库模式,如您所见,我在线程内而不是在 UI 线程上执行数据库操作,如果操作繁重,这会阻塞用户界面。问题是:

真的有必要从 UI 线程之外的线程进行数据库调用还是只是一个繁重的操作?就像在不同的表上添加超过 1 或 2 行一样。

谢谢

4

2 回答 2

3

UI 线程实际上应该只用于向用户显示内容并处理来自用户的输入事件。其他任何事情都应该委托给工作线程。这包括数据库操作。问题是长时间运行的进程会占用主线程,因此在进程期间它无法做任何其他事情。由于很难保证您的数据库操作会很快恢复,因此将访问它的操作放在主线程上可能不是一个好主意。

请记住,这只是一个指导方针。如果您正在执行的任何工作只需要很少的时间,那么启动一个新线程是不值得的。启动一个新线程也会消耗 CPU 周期,因此在另一个线程上完成这项工作可能不值得。

一些建议:

  • 不要直接实例化线程;改用线程池: ThreadPool.QueueUserWorkItem
  • 不要立即关闭进度条。显示它,然后在数据库操作完成后调用调用以将其从工作线程中隐藏。

这是一篇关于线程池的好文章。

于 2013-05-08T22:15:53.313 回答
0

正如 Dan 所说,UI 线程应该仅用于显示内容和获取用户输入。

但是,我们倾向于执行的绝大多数操作都非常快。旋转另一个线程比简单地执行操作本身增加了更多的时间成本。我的建议是,您只为需要几秒钟才能处理的任何事情启动一个新线程。

于 2013-05-08T22:51:46.703 回答