C#中的线程安全数据库访问

时间:2012-09-19 21:04:28

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

我有一个Winforms应用程序可以完成一些重要的数据库工作。它做了很多阅读和一些记录插入。操作最多可能需要30秒到一分钟,具体取决于数据库的大小。现在,我的程序工作正常。

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

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

1 个答案:

答案 0 :(得分:3)

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

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

  

有没有办法在我的用户界面上提供进度条

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