C# 如果两个引用试图在列表中同时添加数据,会发生什么<;T>;集合
检查此功能C# 如果两个引用试图在列表中同时添加数据,会发生什么<;T>;集合,c#,list,c#-4.0,collections,C#,List,C# 4.0,Collections,检查此功能 private static IEnumerable<string> FindAccessibleDatabases() { var connectionStrings = new List<string>(); Parallel.For(0, _connectionStringCollection.Count, (index, loopState) => { try { u
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();
}
私有静态IEnumerable FindAccessibleDatabases()
{
var connectionStrings=新列表();
Parallel.For(0,_connectionStringCollection.Count,(index,loopState)=>
{
尝试
{
使用(var连接=新的OleDbConnection(_connectionStringCollection[index]))
{
connection.Open();
connectionStrings.Add(_connectionStringCollection[index]);
}
}
捕获(OLEDBEException)
{
}
最后
{
connection.Close();
}
});
返回ConnectionString.ToList();
}
我正在使用Parallel.Foreach并一次在多个数据库的列表中添加值。我可以使用ConcurrentBag(在检索数据时是安全的,但没有提到添加),因为我只是将数据添加到列表中,所以可以使用列表
现在,如果两个线程试图同时向列表中添加数据,会发生什么情况
如果它会创造竞争条件,那么如果我使用ConcurrentBag呢
谢谢,
Omkar您面临着发生未指定的坏事情的风险,如重复、一项未添加、数据结构损坏等 表示
List
的Add方法不是线程安全的(具体来说,它表示:
列表
可以同时支持多个读卡器,只要
未修改集合。无法通过集合进行枚举
本质上不是线程安全过程。在极少数情况下
枚举与一个或多个写访问争用,这是
确保线程安全是在整个过程中锁定集合
枚举。允许多个用户访问集合
对于读写线程,您必须实现自己的线程
同步
)。因此,您需要在其周围使用线程同步或其他形式的线程同步,或者需要切换到线程安全的数据结构,如命名空间中的某些内容
如果使用ConcurrentBag的Add方法,就不必担心锁定问题。数据结构是显式线程安全的。您有发生未指定的错误的风险,如重复、未添加一项、损坏数据结构等 表示
List
的Add方法不是线程安全的(具体来说,它表示:
列表
可以同时支持多个读卡器,只要
未修改集合。无法通过集合进行枚举
本质上不是线程安全过程。在极少数情况下
枚举与一个或多个写访问争用,这是
确保线程安全是在整个过程中锁定集合
枚举。允许多个用户访问集合
对于读写线程,您必须实现自己的线程
同步
)。因此,您需要在其周围使用线程同步或其他形式的线程同步,或者需要切换到线程安全的数据结构,如命名空间中的某些内容
如果使用ConcurrentBag的Add方法,就不必担心锁定问题。数据结构是显式线程安全的。它被称为“竞争条件”。不要这样做。如果我俩尝试检索,我可以理解,但在添加时也会发生吗?答案确实非常具体,它是什么类型的列表实现。不明白这怎么可能是C#和Java。@Affe同意,这显然是C#。在Java中,
ArrayList
的答案恰好相同,但这是一个实现细节,称为“竞争条件”。不要这样做。如果我俩尝试检索,我可以理解,但在添加时也会发生吗?答案确实非常具体,它是什么类型的列表实现。不明白这怎么可能是C#和Java。@Affe同意,这显然是C#。对于ArrayList
,Java中的答案恰好相同,但这是一个实现细节。在相同的场景中,如果我使用线程安全的数据结构,会发生这种情况吗?1.锁定列表2。添加了第一项。。。同时,将第二项放入队列3。解锁列表4。退出队列的第二项线程安全数据结构在读写时不需要锁。如果您对System.Collections.Concurrent如何工作有疑问,我建议您单独提问或修改您的问题。在相同的情况下,如果我使用线程安全数据结构,会发生这种情况吗?1.锁定列表2。添加了第一项。。。同时,将第二项放入队列3。解锁列表4。退出队列的第二项线程安全数据结构在读写时不需要锁。如果您对System.Collections.Concurrent如何工作有疑问,我建议您单独提问或修改您的问题。