【问题标题】:synchronizing access to common data同步访问公共数据
【发布时间】:2009-12-03 16:05:31
【问题描述】:

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

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

【问题讨论】:

  • 您提出的技术听起来是一个很好的解决方案。

标签: c# multithreading synchronization


【解决方案1】:

这可以工作。除了锁定,您可以将字段引用标记为 [volatile](http://msdn.microsoft.com/en-us/library/x13ttww7(VS.71).aspx).

如果数据的一致性很重要,但不一定要及时性,则建议使用此方法。换句话说,如果您的应用程序不一定总是需要最新的数据;因为在更新DataTable 时,您将获得一些陈旧的数据。

此外,您需要注意别名(对DataStore 的其他引用),并确保您没有对它进行任何其他引用。否则,您的应用程序中可能有两个不一致的DataStores。

【讨论】:

    【解决方案2】:

    从理论上讲,这听起来是一个很好的解决方案。但是您需要注意几个问题。

    • 只有在多个 WinForms 组件可以有不同版本的DataTable 的情况下,这才是一个很好的解决方案。在获取新表的组件 1 和组件 2 之间可能会发生交换,从而导致它们获得不同的版本。这可以通过额外的锁定技术来解决
    • 当你说交换时,你的意思是后台线程发布,可以说,一个新的DataTable 并开始填充一个完全不同的?您的帖子可以解释为总共只有 2 个 DataTable 实例,并且后台线程正在它们之间切换。如果是这样,那将导致同步问题。我不认为这就是你的意思,但想检查一下。

    【讨论】:

      【解决方案3】:

      双缓冲是要走的路。它消除了重新加载时间长的问题。当您用新数据替换现有数据时,请确保有一个很好的锁定机制。 :)

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-06-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-07-01
        • 1970-01-01
        • 2018-02-14
        相关资源
        最近更新 更多