我有一个动态列表 List<T>,简单而言,这个列表中包含了一系列坐标数据,以每秒 1000 帧——每秒 10 帧不等地速度进行更新。更新方式包括新增,删除,更新每个对象坐标。现在我想以异步地方式每秒以固定频率,例如 60 帧的频率去把这个列表中的坐标显示出来,显示函数不会对列表内容做任何变化。我尝试了用一个 timer 新启动一个线程去访问这个列表,但是总是出现错误,原因是列表的数量在动态发生变化。 请问有什么安全的方法吗?
1
xiangyuecn 2022-08-09 01:14:29 +08:00
显示频率远低于数据更新频率,显示的时候直接加锁复制出一个新 list ,用复制的新数组去显示
|
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 |
3
sutra 2022-08-09 02:26:06 +08:00
这不是读写锁吗?
|
4
csrocks 2022-08-12 09:41:43 +08:00
试试 ConcurrentBag<T> ?
|