如果两个引用试图在List<;T>;收藏

本文关键字:lt List 收藏 gt 两个 引用 如果 | 更新日期: 2023-09-27 18:26:08

检查此函数。

private static IEnumerable<string> FindAccessibleDatabases()
{
    var connectionStrings = new List<string>();
    Parallel.For(0, _connectionStringCollection.Count, (index, loopState) =>
    {
        try
        {
            using (var connection = new OleDbConnection(_connectionStringCollection[index]))
            {
                connection.Open();
                connectionStrings.Add(_connectionStringCollection[index]);
            }
        }
        catch (OleDbException)
        {
        }
        finally         
        {
           connection.Close();
        }
    });
    return connectionStrings.ToList();
}

我正在使用Parallel.Foreach并一次从多个数据库向列表中添加值。我可以使用ConcurrentBag(它在检索数据时是安全的,但没有提到添加),因为我只是将数据添加到列表中,可以使用list。

现在,如果两个线程试图同时向列表中添加数据,会发生什么?

如果它将创建竞争条件,那么如果我使用ConcurrentBag呢?

谢谢,Omkar

如果两个引用试图在List<;T>;收藏

您会面临未指定的坏事发生的风险,如重复、未添加一项、损坏数据结构等。

文档中说List<T>的Add方法不是线程安全的(好吧,具体地说:

List<T>可以同时支持多个读取器,只要集合未修改。通过集合枚举是本质上不是线程安全程序。在极少数情况下枚举与一个或多个写访问争用,这是确保线程安全是在整个过程中锁定集合枚举。允许多个用户访问集合用于阅读和写作的线程,您必须实现自己的同步。

)。因此,您需要使用锁语句或其他形式的线程同步,或者您需要切换到线程安全的数据结构,比如System.Collections.Concurrent命名空间中的数据结构。

如果使用ConcurrentBag的Add方法,则不需要担心锁定问题。数据结构是明确的线程安全的。