c#中的最佳实践线程安全循环链表实现

时间:2016-11-30 14:06:48

标签: c# arrays multithreading list linked-list

我实现了这样的循环链表:

//  MonitoringDictionary is a ConcurrentDictionary<MonitorKey, LinkedList<MonitorValue>> 
var value = ProjectValues.MonitoringDictionary[key];
var monitorValue = new MonitorValue(filePath + "." + memberName + " line:" + lineNumber, executionTime);

if (value.Count >= 5000)
{
    value.RemoveLast();
    value.AddFirst(monitorValue);
}
else
{
    value.AddLast(monitorValue);
}

但有时当我尝试执行此行时:value.RemoveLast();会抛出异常:

  

System.NullReferenceException:未将对象引用设置为实例   一个对象。在   System.Collections.Generic.LinkedList 1.InternalRemoveNode(LinkedListNode 1   在Shared.WebService.Log.Monitoring(Double executionTime,String。)   filePath,String memberName,Int32 lineNumber)

所以我决定在删除最后一项之前锁定链表:

lock (value)
{
    if (value.Count >= 5000)
    {
        value.RemoveLast();
        value.AddFirst(monitorValue);
    }
    else 
    {
        value.AddLast(monitorValue);
    }
}

但现在我担心表现和死胡同,所以这是我的问题:

1-锁定链表是否解决了问题?

2-实施循环链表是否有更好的做法?(性能是我的第一要务)

谢谢。

0 个答案:

没有答案