列出最后一小时内的项目

本文关键字:项目 一小时 最后 | 更新日期: 2023-09-27 18:29:17

我正在将内存中的值记录到列表类型结构中,并且希望只保留在最后一个小时内收集的项。这是在一个asp.net mvc应用程序中,所以列表是静态的,可以由多个线程访问。我目前每80分钟检查一次,只会删除超过60分钟的请求(只是这样就不会对每个请求都执行)。我在代码周围有一个锁,它遍历结构以查找旧值,将这些值收集到临时持有者中,然后从原始结构中删除它们。

我似乎遇到了一些锁定问题,所以很好奇是否有某种内置结构或防弹代码可以帮助我完成这项工作,而不是尝试手动编码。

列出最后一小时内的项目

当你说你"登录"到你的列表时,你似乎只需要从该列表中安全地线程

  • 将项目添加到末尾
  • 将项目移到前面
  • 对其进行迭代
  • 性能(我认为"出现一些锁定问题"意味着性能较差)

如果是,请使用ConcurrentQueue<T>。这消除了对锁定的需要,以及它的枚举器

表示队列内容的即时快照。它不反映调用GetEnumerator后对集合的任何更新。枚举器可以安全地与队列的读取和写入同时使用。

枚举器按添加集合元素的顺序返回集合元素,即FIFO顺序(先进先出)。

为什么不使用线程安全集合来进行这种行为?试图发现一个拜克?

另一种方法可以是使用Reactive Rx(但第二种方法的性能可能较低,但它在开发方面确实很棒)。

只要LINQ不是线程安全的,你就应该使用这个(你可能已经做了):

lock (lockObject)
{
    newCollection = yourCollection.Where(x => ...);
}

您可以使用observable,它在查询中是类似的,但是是线程安全的。