gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 10:06:58 27 4
gpt4 key购买 nike

我正在开发一个以 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 中使用 Repository Pattern,如您所见,我在线程内而不是在 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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com