我在List.Find()上遇到System.IndexOutOfRangeException。问题是它不一致,并且只在生产环境中发生。浏览List.Find(Predicate match) method的MSDN文档,但它确实说明索引超出范围异常。在什么情况下会从List.Find()方法抛出System.IndexOutOfRangeException?
这是在ASP.Net应用程序中发生的。代码在静态方法中,如下所示:
private static T GetReflectionInfo<T>(object obj, string memberName) where T : System.Reflection.MemberInfo
{
var knownInfos = new List<MemberInfo>();
/// populate the list
/// this line is where the exception is thrown. T is the generic type passed in.
T info = (T) knownInfos.Find(item => item is T && item.Name.EqualsIgnoreCase(memberName));
}
[更新] - 其中一个节点出现了问题。感谢您的回答和评论。
答案 0 :(得分:6)
如果在Find正在运行时修改List
(特别是删除项目),则可能会抛出它。根据{{3}},这是不允许的(强调我的):
线程安全
公共静态(在Visual Basic中为Shared)成员 类型是线程安全的。不保证任何实例成员 线程安全。
List(Of T)可以同时支持多个读者,只要 集合未修改 。列举一个集合是 本质上不是一个线程安全的程序。在罕见的情况下 枚举与一个或多个写访问争用,唯一的方法 确保线程安全是在整个过程中锁定集合 列举。允许多个访问集合 阅读和写作的线程,你必须实现自己的 同步。