我正在开发一个 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
- 不要立即关闭进度条。显示它,然后在数据库操作完成后调用该调用以在工作线程中隐藏它。
关于c# - 使用线程进行数据库操作的最佳方式是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16451041/