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开发框架网发布内容,转载请附上原文出处连接
张国生
上一篇:.net 微服务之RFC
下一篇:使用队列(ConcurrentQueue)时获取队列运行报错
评论列表

发表评论

评论内容
昵称:
关联文章

C# List<T>线安全
C# 线入门系列(三)
C# 线入门系列(二)
C# 线入门系列(一)
.Net 线安全集合
SQLite Database 线访问需要注意的问题
C#线下载图片 URL转Image
Python线中试用wmi报错
C# List排序
ManualResetEvent实现线的暂停与恢复
Python退出主进程后子线不会退出的解决方案
Roslyn+T4+EnvDTE项目完全自动化(3) ——生成c++代码
API接口安全设计方案
.NET Core 运行时T4模板使用,T4生成代码
C#的进化——C#发展史、C#1.0-10.0语法系统性梳理、C#与JAVA的对比
C#安全帮助类,提供MD5,AES加解密,SHA-1加密等
.NET 通用条件动态参数查询方法 - SqlSugar ORM
Roslyn+T4+EnvDTE项目完全自动化(1) ——类自动生成界面
C#性能优化总结
SQL Server 数据库安全之角色

联系我们
联系电话:15090125178(微信同号)
电子邮箱:garson_zhang@163.com
站长微信二维码
微信二维码