如果两个引用试图在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>
的Add方法不是线程安全的(好吧,具体地说:
List<T>
可以同时支持多个读取器,只要集合未修改。通过集合枚举是本质上不是线程安全程序。在极少数情况下枚举与一个或多个写访问争用,这是确保线程安全是在整个过程中锁定集合枚举。允许多个用户访问集合用于阅读和写作的线程,您必须实现自己的同步。
)。因此,您需要使用锁语句或其他形式的线程同步,或者您需要切换到线程安全的数据结构,比如System.Collections.Concurrent命名空间中的数据结构。
如果使用ConcurrentBag的Add方法,则不需要担心锁定问题。数据结构是明确的线程安全的。