我将内存中的值记录到列表类型结构中,并且只想保留在过去一小时内收集的项目。这是在asp.net mvc应用程序中,因此列表是静态的并且由多个线程访问。我目前每隔80分钟检查一次,并且只会删除超过60分钟的那些(只是因为每次请求都没有执行)。我对代码进行了锁定,该代码遍历结构以查找旧值,将这些值收集到临时文件夹中,然后将其从原始结构中删除。
我似乎遇到了一些锁定问题,所以很奇怪是否有某种内置结构或一些防弹代码可以帮助我这样做,而不是试图手动编码。
答案 0 :(得分:1)
正如你所说" log"在你的列表中,似乎所有你需要的是线程安全
如果是这样,请使用ConcurrentQueue<T>
。这消除了锁定的需要,以及enumerator
表示队列内容的时刻快照。调用GetEnumerator后,它不会反映对集合的任何更新。枚举器可以安全地与队列的读取和写入同时使用。
枚举器按照添加顺序返回集合元素,即FIFO顺序(先进先出)。
答案 1 :(得分:-1)
为什么你不使用thread-safe collections这种行为?试图发现一个byke?
另一种方法可以是使用Reactive Rx(但第二种方式可能会降低性能,但它在开发方面确实很棒)。
只要LINQ不是线程安全的,你应该使用它(你可能已经做过):
lock (lockObject)
{
newCollection = yourCollection.Where(x => ...);
}
你可以使用observables,它们在查询时类似,但是是线程安全的。