c# list 怎么多线程安全,谁帮我看怎么封装
如果你要 封装 List 变成线程安全的话。那么就新建一个类,将List的Add
,Remove
,[]
操作加上同一把锁lock
是不是可以结合 redis来实现线程安全,可以利用 redis的锁机制,包括分布式锁机制等等.
c#有专门对的线程安全的集合,可以查查,我忘了叫什么了
把list操作这段, 加上lock, 就可以啦
一个是加lock,一个是用并发集合
ConcurrentQueue、ConcurrentDictionary
public class ThreadSafeList<T> : IList<T>
{
protected List<T> _interalList = new List<T>();
// Other Elements of IList implementation
public IEnumerator<T> GetEnumerator()
{
return Clone().GetEnumerator();
}
System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
{
return Clone().GetEnumerator();
}
protected static object _lock = new object();
public List<T> Clone()
{
List<T> newList = new List<T>();
lock (_lock)
{
_interalList.ForEach(x => newList.Add(x));
}
return newList;
}
}
class MyList<T> {
private List<T> _list = new List<T>();
private object _sync = new object();
public void Add(T value) {
lock (_sync) {
_list.Add(value);
}
}
public bool Find(Predicate<T> predicate) {
lock (_sync) {
return _list.Find(predicate);
}
}
public T FirstOrDefault() {
lock (_sync) {
return _list.FirstOrDefault();
}
}
}
同样可以试下ImmutableList,ImmutableList<T> 可以索引,但是注意性能问题,不能用它来简单的替代 List<T>。
参考:
https://github.com/dtao/ConcurrentList
https://stackoverflow.com/questions/6601611/no-concurrentlistt-in-net-4-0