2012-09-19 41 views
1

我有一个Winforms应用程序,可以完成一些重要的数据库工作。它做了大量的阅读和插入记录。根据数据库的大小,该操作最多可能需要30秒到1分钟。现在,我的程序运行良好。C#中线程安全的数据库访问#

我的问题是,虽然我的程序正在这样做,我的UI线程被阻止,直到数据库的东西完成。我想将数据库函数放到一个线程中,但根据this MSDN article,ADO.NET不是线程安全的。

有没有一种方法可以在我的用户界面上提供进度条,或者在“ADO.NET不是线程安全的”方式下提供进度条?也许编写自己的继承SqlDataReaderSqlConnection的类以使其线程安全。这甚至有可能吗?

+0

哪个数据库? Access与MS-SQL有一组不同的问题。 –

+0

@HenkHolterman - 它实际上可以跨越三种不同的数据库服务器,SQL Server 2000,Microsoft Access和MySQL。 – Icemanind

+0

这可能会让事情变得复杂。你如何处理密钥,他们可以成为GUID? –

回答

3

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

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

有没有提供关于我的UI

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