在MSDN文档说,
public class SomeObject
{
public void SomeOperation()
{
lock(this)
{
//Access instance variables
}
}
}
Run Code Online (Sandbox Code Playgroud)
如果可以公开访问实例,那就是"一个问题".我想知道为什么?是因为锁定的持有时间超过了必要的时间吗?还是有一些更阴险的原因?
我正在使用ConcurrentQueue共享数据结构,其目的是保存传递给它的最后N个对象(历史记录类型).
假设我们有一个浏览器,我们希望最后100个浏览Urls.我想要一个队列,当容量变满时(历史中的100个地址),当新条目插入(入队)时自动删除(出列)最旧的(第一个)条目.
我怎样才能实现这个目标System.Collections?
我使用 aConcurrentQueue将 I/O 绑定任务中的项目入队,并将它们从另一个任务中出队进行处理。当队列达到一定大小时,我停止将项目添加到队列中,以便处理可以跟上。为此,我检查了该ConcurrentQueue.Count属性。
问题在于该Count属性的行为似乎与列表或其他集合中的行为不同。它非常慢,队列越大,读取Count属性的速度就越慢。一个项目中有 20k 个项目,ConcurrentQueue几乎所有处理器时间都花在了该Count属性上。
粗略示例:
while (reader.Read())
{
if(Queue.Count >= MaxQueueSize)
{
//Wait
}
//Do Stuff
}
Run Code Online (Sandbox Code Playgroud)
运行性能分析器时,所有时间都花在System.Collections.Concurrent.CDSCollectionETWBCLProvicer.ctor().
这似乎只发生在 .NET Core 2 上,这不会发生在 .NET 4.6.2 中
.Net Core 有没有办法解决这个问题?