我将拥有一个可以从多个线程和主线程访问的数据库对象。我不希望他们同时访问底层数据库对象,所以我将编写一组线程安全的公共(public)方法,可以从多个线程访问。
我的第一个想法是在连接周围使用 lock
,例如 lock(oleDbConnection)
,但问题是我必须为主线程锁定它因为是另一个可以访问它的线程。这意味着要重写大量代码。
但是,由于这些线程和主线程不会经常访问数据库,每次我调用任何数据库时,只使用我的一些控件(可能是主窗体)的 Invoke
方法怎么样?来自另一个线程的方法。这样,据我所知,这些方法永远不会被并发调用,我也不需要担心主线程。我想唯一的问题是会稍微降低性能,但正如我所说,数据库访问频率不高;我使用线程的原因不是为了它们可以并发访问数据库,而是为了它们可以并发执行其他操作。
那么这听起来是个好主意吗?我错过了什么吗?听起来有点太容易了,所以我很怀疑。
最佳答案
据我所知,这听起来像是一个非常糟糕的主意。
问题是当写 lock
时你是在说“我希望这段代码成为关键部分”,而在写 Invoke
时你是在说“我想要这个在 UI 线程上执行”。这两件事当然不是等价的,这会导致很多问题。例如:
Invoke
通常用于访问 UI 控件。如果开发人员看到Invoke
而没有任何 UI 相关的东西,然后说“哎呀,那是不需要的Invoke
;让我们摆脱它吧”怎么办?- 如果最终存在多个 UI 线程怎么办?
- 如果数据库操作耗时较长(或超时)怎么办?您的用户界面将停止响应。
关于c# - 可以使用 Control.Invoke 而不是使用锁吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7861497/