V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
wdc63
V2EX  ›  C#

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

  •  
  •   wdc63 · 2022-08-09 00:31:19 +08:00 · 1566 次点击
    这是一个创建于 865 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

    想要自己实现的话,看看这个
    https://docs.microsoft.com/en-us/dotnet/api/system.threading.readerwriterlockslim?view=net-6.0
    sutra
        3
    sutra  
       2022-08-09 02:26:06 +08:00
    这不是读写锁吗?
    csrocks
        4
    csrocks  
       2022-08-12 09:41:43 +08:00
    试试 ConcurrentBag<T> ?
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2456 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 20ms · UTC 01:31 · PVG 09:31 · LAX 17:31 · JFK 20:31
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.