wdc63
V2EX  ›  C#

如何固定频率异步地访问一个动态列表。

  •  
  •   wdc63 · Aug 9, 2022 · 3018 views
    This topic created in 1550 days ago, the information mentioned may be changed or developed.

    我有一个动态列表 List<T>,简单而言,这个列表中包含了一系列坐标数据,以每秒 1000 帧——每秒 10 帧不等地速度进行更新。更新方式包括新增,删除,更新每个对象坐标。现在我想以异步地方式每秒以固定频率,例如 60 帧的频率去把这个列表中的坐标显示出来,显示函数不会对列表内容做任何变化。我尝试了用一个 timer 新启动一个线程去访问这个列表,但是总是出现错误,原因是列表的数量在动态发生变化。 请问有什么安全的方法吗?

    4 replies  •  2022-08-12 09:41:43 +08:00
    xiangyuecn
    xiangyuecn
    Aug 9, 2022
    1
    显示频率远低于数据更新频率,显示的时候直接加锁复制出一个新 list ,用复制的新数组去显示
    Mithril
    Mithril
    Aug 9, 2022
    2
    不在乎瞬时数据准确性的话,用定长数组,长度超过最大容量就行,删除的时候置空对象。
    每次你那个 timer 的线程扫一遍全部数组,然后移除掉空对象剩下的显示出来。
    想优化的话就弄个变量记录有效数据量,每次都只扫这么多。多了少了处理一下就行。

    如果要每次显示的数据都是准确的,那最简单的就是扔数据库里,让它帮你解决锁的问题。SQLite 或者 LiteDB 就够了。

    想要自己实现的话,看看这个
    https://docs.microsoft.com/en-us/dotnet/api/system.threading.readerwriterlockslim?view=net-6.0
    sutra
    sutra
    Aug 9, 2022
    3
    这不是读写锁吗?
    csrocks
    csrocks
    Aug 12, 2022
    4
    试试 ConcurrentBag<T> ?
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   1767 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 16:59 · PVG 00:59 · LAX 08:59 · JFK 11:59
    ♥ Do have faith in what you're doing.