c# - 使用线程进行数据库操作的最佳方式是什么?

标签 c# sql windows multithreading forms

我正在开发一个 WinForms 应用程序,以 SQL Compact 作为主数据库。有人告诉我,我永远不会弄乱 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 行一样。

谢谢

最佳答案

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

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

一些建议:

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

This is a good article on the thread pool.

关于c# - 使用线程进行数据库操作的最佳方式是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16451041/

相关文章:

基于 OR 子句的 SQL 计算列

windows - 使用 Administrator 以外的帐户使用 "net use"命令

c++ - 获取调用堆栈的大小

c# - 如何在没有 "runat=server"的情况下访问 C# 代码中的 HTML 控件?

用于源代码格式化的 C#/.NET 库,就像 Stack Overflow 使用的那样?

sql - 表的大小会影响 SQL Server 中插入查询的性能吗?

c# - 在 Access 中将行转换为列

java - 使用java程序打开文件扩展名

c# - 以这种方式使用锁位复制位图区域是否安全(双关语)?

c# - 从 Microsoft Chart 控件获取鼠标单击事件单击数据标记