c# - 可以使用 Control.Invoke 而不是使用锁吗?

标签 c# winforms multithreading

我将拥有一个可以从多个线程和主线程访问的数据库对象。我不希望他们同时访问底层数据库对象,所以我将编写一组线程安全的公共(public)方法,可以从多个线程访问。

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

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

那么这听起来是个好主意吗?我错过了什么吗?听起来有点太容易了,所以我很怀疑。

最佳答案

据我所知,这听起来像是一个非常糟糕的主意

问题是当写 lock 时你是在说“我希望这段代码成为关键部分”,而在写 Invoke 时你是在说“我想要这个在 UI 线程上执行”。这两件事当然不是等价的,这会导致很多问题。例如:

  1. Invoke 通常用于访问 UI 控件。如果开发人员看到 Invoke 而没有任何 UI 相关的东西,然后说“哎呀,那是不需要的 Invoke;让我们摆脱它吧”怎么办?
  2. 如果最终存在多个 UI 线程怎么办?
  3. 如果数据库操作耗时较长(或超时)怎么办?您的用户界面将停止响应。

关于c# - 可以使用 Control.Invoke 而不是使用锁吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7861497/

相关文章:

c# - 在 .NET 应用程序中处理大型数组的性能

.net - WinForms ListView : How to specify width of a ListViewItem when there are columns but in View. 列表显示模式?

Java:通过反射多次访问同步方法?

Java 在线程中通过套接字发送对象

c# - 轨迹栏上的值

python time.sleep 锁进程

c# - 无法加载文件或程序集 Microsoft.ServiceModel.DomainServices.Hosting

c# - JSON 计数只返回 1 而不是 2

c# - 如何从谷歌图片搜索中获取图片 URL-s

c# - 如何将字典对象绑定(bind)到 Windows 窗体 gridview