【问题标题】:List with items in the last hour列出最近一小时内的项目
【发布时间】:2014-11-04 17:12:26
【问题描述】:

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

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

【问题讨论】:

  • 如何向我们展示您当前使用的代码。另外,您可以查看Code Review
  • msdn.microsoft.com/en-us/library/dd997373(v=vs.110).aspx - 是一个很好的起点。出于好奇,您使用什么作为数据的后备存储?
  • 如果没有看到代码,很难知道代码出了什么问题。目前还不清楚为什么你需要一个临时持有者......添加到一个链接列表可以让你通过简单地从尾部删除项目来进行修剪......
  • “遇到一些锁定问题”是什么意思?表现不佳?死锁?由于未锁定导致的不可预测的行为?
  • 我实际上忘记了这篇文章,如果我记得这个问题实际上是由于试图从我当前正在迭代的列表中删除项目而引起的。 Woops ;) 如果我能再次找到代码,我会添加细节。谢谢

标签: c# asp.net data-structures


【解决方案1】:

正如您所说的“登录”到您的列表,看来您从该列表中需要的只是线程安全

  • 将项目添加到末尾
  • 将项目移到前面
  • 对其进行迭代
  • 性能(我认为“遇到一些锁定问题”意味着性能不佳)

如果是这样,只需使用ConcurrentQueue<T>。这消除了对锁定的需要,以及它的enumerator

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

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

【讨论】:

    【解决方案2】:

    为什么你不使用thread-safe collections 来处理这种行为?试图发现一条小路?

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

    只要 LINQ 不是线程安全的,并且您应该使用它(您可能已经这样做了):

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-07-29
      • 2012-09-04
      • 1970-01-01
      • 2014-06-16
      • 1970-01-01
      • 1970-01-01
      • 2015-01-04
      相关资源
      最近更新 更多