Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/311.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/reporting-services/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 同步对公共数据的访问_C#_Multithreading_Synchronization - Fatal编程技术网

C# 同步对公共数据的访问

C# 同步对公共数据的访问,c#,multithreading,synchronization,C#,Multithreading,Synchronization,我有一个WinForms应用程序(c#),它有一个后台线程,定期从数据源获取数据,对其进行一些操作,并将其放入数据表中。应用程序中有1个或多个组件定期轮询此公共数据以处理这些数据。我想知道,什么是同步的“正确”方法,例如组件在更新数据时不查询数据 在更新数据时锁定某些内容将不起作用,因为更新可能需要几秒钟。所以我想,为什么不“双缓冲”它,例如,更新第二个数据表中的数据,然后在完成交换时(仅为交换操作锁定)。这是否合适,或者是否有更好的方法来实现这一点?这可能会奏效。您可以将字段引用标记为[vol

我有一个WinForms应用程序(c#),它有一个后台线程,定期从数据源获取数据,对其进行一些操作,并将其放入数据表中。应用程序中有1个或多个组件定期轮询此公共数据以处理这些数据。我想知道,什么是同步的“正确”方法,例如组件在更新数据时不查询数据


在更新数据时锁定某些内容将不起作用,因为更新可能需要几秒钟。所以我想,为什么不“双缓冲”它,例如,更新第二个数据表中的数据,然后在完成交换时(仅为交换操作锁定)。这是否合适,或者是否有更好的方法来实现这一点?

这可能会奏效。您可以将字段引用标记为[
volatile
]),而不是锁定

如果数据的一致性很重要,但不一定是及时性,那么实际上建议使用这种方法。换句话说,如果您的应用程序不一定总是需要最新和最新的数据;因为在更新数据表时,您将得到一些过时的数据


此外,您还需要注意别名(对
数据存储的其他引用
)并确保不持有对它的任何其他引用。否则,您的应用程序中可能有两个不一致的
数据存储。

双缓冲是一种解决方法。它消除了重新加载时间过长的问题。只需确保在用新数据替换现有数据时具有良好的锁定机制。:)


数据是否为组件的只读数据?如果他们正在更改数据,您需要小心同时写回和读取。

理论上这听起来是一个很好的解决方案。但是你需要注意一些问题

  • 如果多个WinForms组件可以具有不同版本的
    数据表
    ,那么这是一个好的解决方案。在获取新表的component1和component2之间,可能会发生交换,导致它们获得不同的版本。这可以通过附加的锁定技术来解决
  • 当您说swap时,您的意思是后台线程发布一个新的
    DataTable
    ,并开始填充一个完全不同的表吗?您的帖子可能被解释为总共只有2个
    DataTable
    实例,后台线程正在它们之间切换。如果是这样,将导致同步问题。我想你不是这个意思,但我想核实一下
您提出的技术听起来是一个很好的解决方案。