C# 同步对公共数据的访问
我有一个WinForms应用程序(c#),它有一个后台线程,定期从数据源获取数据,对其进行一些操作,并将其放入数据表中。应用程序中有1个或多个组件定期轮询此公共数据以处理这些数据。我想知道,什么是同步的“正确”方法,例如组件在更新数据时不查询数据C# 同步对公共数据的访问,c#,multithreading,synchronization,C#,Multithreading,Synchronization,我有一个WinForms应用程序(c#),它有一个后台线程,定期从数据源获取数据,对其进行一些操作,并将其放入数据表中。应用程序中有1个或多个组件定期轮询此公共数据以处理这些数据。我想知道,什么是同步的“正确”方法,例如组件在更新数据时不查询数据 在更新数据时锁定某些内容将不起作用,因为更新可能需要几秒钟。所以我想,为什么不“双缓冲”它,例如,更新第二个数据表中的数据,然后在完成交换时(仅为交换操作锁定)。这是否合适,或者是否有更好的方法来实现这一点?这可能会奏效。您可以将字段引用标记为[vol
在更新数据时锁定某些内容将不起作用,因为更新可能需要几秒钟。所以我想,为什么不“双缓冲”它,例如,更新第二个数据表中的数据,然后在完成交换时(仅为交换操作锁定)。这是否合适,或者是否有更好的方法来实现这一点?这可能会奏效。您可以将字段引用标记为[
volatile
]),而不是锁定
如果数据的一致性很重要,但不一定是及时性,那么实际上建议使用这种方法。换句话说,如果您的应用程序不一定总是需要最新和最新的数据;因为在更新数据表时,您将得到一些过时的数据
此外,您还需要注意别名(对
数据存储的其他引用
)并确保不持有对它的任何其他引用。否则,您的应用程序中可能有两个不一致的数据存储。双缓冲是一种解决方法。它消除了重新加载时间过长的问题。只需确保在用新数据替换现有数据时具有良好的锁定机制。:)
数据是否为组件的只读数据?如果他们正在更改数据,您需要小心同时写回和读取。理论上这听起来是一个很好的解决方案。但是你需要注意一些问题
- 如果多个WinForms组件可以具有不同版本的
数据表
,那么这是一个好的解决方案。在获取新表的component1和component2之间,可能会发生交换,导致它们获得不同的版本。这可以通过附加的锁定技术来解决
- 当您说swap时,您的意思是后台线程发布一个新的
DataTable
,并开始填充一个完全不同的表吗?您的帖子可能被解释为总共只有2个DataTable
实例,后台线程正在它们之间切换。如果是这样,将导致同步问题。我想你不是这个意思,但我想核实一下李>
您提出的技术听起来是一个很好的解决方案。