相关疑难解决方法(0)

为什么锁(这个){...}不好?

MSDN文档说,

public class SomeObject
{
  public void SomeOperation()
  {
    lock(this)
    {
      //Access instance variables
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

如果可以公开访问实例,那就是"一个问题".我想知道为什么?是因为锁定的持有时间超过了必要的时间吗?还是有一些更阴险的原因?

c# multithreading locking

462
推荐指数
6
解决办法
15万
查看次数

固定大小队列,在新的enques上自动将旧值出列

我正在使用ConcurrentQueue共享数据结构,其目的是保存传递给它的最后N个对象(历史记录类型).

假设我们有一个浏览器,我们希望最后100个浏览Urls.我想要一个队列,当容量变满时(历史中的100个地址),当新条目插入(入队)时自动删除(出列)最旧的(第一个)条目.

我怎样才能实现这个目标System.Collections

c# queue fifo

111
推荐指数
7
解决办法
7万
查看次数

.NET Core 中的 ConcurrentQueue.Count 非常慢

我使用 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 有没有办法解决这个问题?

c# performance .net-core

3
推荐指数
1
解决办法
3738
查看次数

标签 统计

c# ×3

.net-core ×1

fifo ×1

locking ×1

multithreading ×1

performance ×1

queue ×1