C# List<T>多线程安全
在C#中,List<T>
不是线程安全的。如果你需要在多线程环境中使用 List<T>
,你必须确保对列表的访问是同步的,以避免竞争条件、数据损坏或其他线程安全问题。
以下是一些确保 List<T>
在多线程环境中安全使用的方法:
使用锁(Lock)
使用 lock
语句可以确保在同一时刻只有一个线程能够访问 List<T>
。
C# 全选
private readonly object _lock = new object();
private List<T> _list = new List<T>();
public void AddItem(T item)
{
lock (_lock)
{
_list.Add(item);
}
}
public T GetItem(int index)
{
lock (_lock)
{
return _list[index];
}
}
使用线程安全集合
.NET 提供了一些线程安全的集合,如 ConcurrentBag<T>
, ConcurrentQueue<T>
, ConcurrentStack<T>
和 BlockingCollection<T>
。
例如,使用 ConcurrentBag<T>
:
C# 全选
private ConcurrentBag<T> _concurrentBag = new ConcurrentBag<T>();
public void AddItem(T item)
{
_concurrentBag.Add(item);
}
public bool TryTake(out T result)
{
return _concurrentBag.TryTake(out result);
}
使用 ReadOnlyCollection<T>
如果你只需要在多个线程中读取 List<T>
,则可以将其暴露为一个 ReadOnlyCollection<T>
,这样就可以保证读操作是线程安全的。
C# 全选
private List<T> _list = new List<T>();
public ReadOnlyCollection<T> ReadOnlyList => _list.AsReadOnly();
版权声明:本文为YES开发框架网发布内容,转载请附上原文出处连接
post 张国生