【问题标题】:synchronizing access to common data同步访问公共数据
【发布时间】:2009-12-03 16:05:31
【问题描述】:
我有一个 WinForms 应用程序 (c#),它有一个后台线程,该线程定期从数据源获取数据,对其进行一些操作,并将其放入 DataTable。应用程序中有 1 个或多个组件会定期轮询这些公共数据以对其进行处理。我想知道,同步它的“正确”方式是什么,例如组件在更新时不查询数据?
在更新数据时锁定某些内容将不起作用,因为更新可能需要几秒钟的时间。所以我想,为什么不“双缓冲”呢,例如更新第二个 DataTable 中的数据,然后在完成交换时(仅为交换操作锁定)。这是合适的,还是有更好的方法来做到这一点?
【问题讨论】:
标签:
c#
multithreading
synchronization
【解决方案2】:
从理论上讲,这听起来是一个很好的解决方案。但是您需要注意几个问题。
- 只有在多个 WinForms 组件可以有不同版本的
DataTable 的情况下,这才是一个很好的解决方案。在获取新表的组件 1 和组件 2 之间可能会发生交换,从而导致它们获得不同的版本。这可以通过额外的锁定技术来解决
- 当你说交换时,你的意思是后台线程发布,可以说,一个新的
DataTable 并开始填充一个完全不同的?您的帖子可以解释为总共只有 2 个 DataTable 实例,并且后台线程正在它们之间切换。如果是这样,那将导致同步问题。我不认为这就是你的意思,但想检查一下。
【解决方案3】:
双缓冲是要走的路。它消除了重新加载时间长的问题。当您用新数据替换现有数据时,请确保有一个很好的锁定机制。 :)
数据是只读的吗?如果他们正在更改数据,您需要小心同时写回和读取。