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

2022-08-09 00:31:19 +08:00
 wdc63

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

1357 次点击
所在节点    C#
4 条回复
xiangyuecn
2022-08-09 01:14:29 +08:00
显示频率远低于数据更新频率,显示的时候直接加锁复制出一个新 list ,用复制的新数组去显示
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
2022-08-09 02:26:06 +08:00
这不是读写锁吗?
csrocks
2022-08-12 09:41:43 +08:00
试试 ConcurrentBag<T> ?

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/871551

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX