使用Control可以吗?调用而不是使用锁

本文关键字:调用 Control 使用 | 更新日期: 2023-09-27 18:11:58

我将有一个数据库对象,可以从多个线程以及从主线程访问。我不希望它们并发地访问底层数据库对象,所以我将编写一组可以从多个线程访问的线程安全的公共方法。

我的第一个想法是在我的连接周围使用lock,如lock(oleDbConnection),但问题是我必须为主线程锁定它,因为还有一个线程可以访问它。这就意味着要重写大量的代码。

但是,由于这些线程和主线程不会经常访问数据库,每次我从另一个线程调用任何数据库方法时,如何使用一些我的控件(也许是主要形式)Invoke方法。这样,据我所知,这些方法永远不会被并发调用,我也不需要担心主线程的问题。我想唯一的问题是性能会降低一点,但正如我所说,数据库不会被经常访问;我使用线程的原因不是为了让它们可以并发地访问数据库,而是为了让它们可以并发地执行其他操作。

这听起来是个好主意吗?我错过什么了吗?听起来太简单了,所以我很怀疑。

使用Control可以吗?调用而不是使用锁

这听起来似乎可以正常工作,但这也听起来像一个非常糟糕的主意 。

问题是,当写lock你说"我希望这个代码是一个临界区",而当写Invoke你说"我希望这是在UI线程上执行"。这两件事当然是不等同的,这可能会导致很多问题。例如:

  1. Invoke通常用于访问UI控件。如果开发者看到Invoke并没有与ui相关的内容,并认为"看,这是一个不需要的Invoke;让我们摆脱它"?
  2. 如果存在多个UI线程怎么办?
  3. 数据库操作时间过长(或超时)怎么办?你的UI将停止响应。

肯定会选择锁。当执行可能需要时间的操作(包括任何类型的数据库访问)时,您通常希望UI线程响应;例如,你不知道它是否活着。

此外,处理连接的典型方法是为每个请求创建、使用和处置连接,而不是重用相同的连接。这也许可以解决一些并发性问题。

你为什么不尝试使用Connection Pool呢?每个线程都可以使用不同的DB连接完成工作,并通过Invoke将结果发送给主线程。Connection Pooling是服务器中非常常用的方法。

参见使用SQL Server连接池