现有代码中多线程锁定列表的最佳解决方案?

时间:2014-07-02 08:24:50

标签: c# multithreading list

我在asp.net中有一个项目。 我的课程FieldInfo包含List<ValueInfo>。 许多地方都使用List<ValueInfo>。但有时,我必须更改列表(清除项目并再次添加项目),因此我遇到多线程问题,因为有人正在阅读列表,有人清除列表。 在许多地方使用了读取List<ValueInfo>的代码,代码只在一个地方编写代码。 我想问一下:我是否有一个解决方案可以确保线程安全的读/写,而且我不需要改变任何内容来阅读List<ValueInfo>&#34;(如果我改变了,我必须改变很多代码)?

FieldInfo定义:

class FieldInfo
{
    public List<ValueInfo> listValueInfo { get; set; }
}

编写清单的代码:

listValueInfo.clear();
listValueInfo.add(valueInfoObject);

读取列表的代码(在许多文件中,很多地方):

foreach(ValueInfo valueinfo in listValueInfo)
{
}

1 个答案:

答案 0 :(得分:0)

您可以查看System.Collections.Concurrent命名空间: http://msdn.microsoft.com/en-us/library/system.collections.concurrent(v=vs.110).aspx

这包含可以使用的线程安全集合而不是List(例如ConcurrentBag。或者只是锁定这样的线程不安全操作。只需确保所有线程的锁对象都相同(或者使用集合本身作为锁定对象)

 private object lockObject = new object();

//Write 
lock(_lockObject)
 {
    listValueInfo.clear(); 
    listValueInfo.add(valueInfoObject);
}
//Read
lock(_lockObject)
{

   foreach(ValueInfo valueinfo in listValueInfo)
   {

   }
}