【问题标题】:Thread safe database access in C#C# 中的线程安全数据库访问
【发布时间】:2012-09-19 21:04:28
【问题描述】:

我有一个 Winforms 应用程序,它执行一些繁重的数据库工作。它做了很多读取和一些记录的插入。该操作最多可能需要 30 秒到一分钟,具体取决于数据库的大小。现在,我的程序运行良好。

我的问题是,当我的程序执行此操作时,我的 UI 线程被阻塞,直到数据库内容完成。我想把数据库函数放到一个线程中,但是,根据this MSDN article,ADO.NET 不是线程安全的。

有没有办法在我的 UI 上提供进度条或以某种方式解决“ADO.NET 不是线程安全的”?也许要编写我自己的继承SqlDataReader 或SqlConnection 的类以使其成为线程安全的。这甚至可能吗?

【问题讨论】:

  • 哪个数据库? Access 的问题与 MS-SQL 不同。
  • @HenkHolterman -- 它实际上可以跨三个不同的数据库服务器工作,SQL Server 2000、Microsoft Access 和 MySQL。
  • 这可能会使事情复杂化。您如何处理密钥,它们可以成为 GUID 吗?
  • Henk,我的 SQL Server 2000 数据库中的表是整数并且它们具有标识,因此 SQL Server 应该注意这一点。对于 MS Access 和 MySQL,我不会对它们进行 CRUD。仅 SELECT 查询。这是否更简化了事情?
  • 是的,应该可以解决所有关键问题。

标签: c# sql-server winforms multithreading thread-safety


【解决方案1】:

只需使用 backgroundworker 并确保每个线程 (bgw) 创建自己的 Connection 对象。

关于链接的文章,请确保您有一种并发安全的方式来生成密钥。让 Db 生成它们是最好的选择。

有没有办法在我的 UI 上提供进度条

这很棘手。 Bgw 可以 ReportProgress 很好,但从正在运行的查询中获取它是一个问题。甚至行的总数通常也只有在最后才知道。
但是你总是可以伪造它,用户不介意/知道。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多