我在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)
{
}
答案 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)
{
}
}