2012-04-02 28 views
0

我得到List.Find()System.IndexOutOfRangeException。问题在于它不一致,并且只在生产环境中发生。阅读关于List.Find(Predicate match) method的MSDN文档,但它确实提到了索引超出范围的异常。在什么情况下会从List.Find()方法抛出System.IndexOutOfRangeException?List <T>。查找引发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)); 
} 

[更新] - 这个问题竟然是出了故障,节点之一。感谢您的回答和评论。

+7

向我们显示您的代码。 – 2012-04-02 20:11:02

+1

该列表如何持续存在?在Web环境中,共享资源需要特殊处理。 – leppie 2012-04-02 20:11:31

+0

您是否在多线程应用程序中使用它? – JaredPar 2012-04-02 20:11:34

回答

6

如果在查找正在运行时修改List(特别是从另一个线程删除项目),可能会引发此问题。按照the documentation,这是不允许的(重点煤矿):

线程安全

公共静态这种 类型的成员(在Visual Basic中的Shared)都是线程安全的。任何实例成员不保证是线程安全的 。

一览表(Of T)已可以支持多个读者同时,只要 集合不会被改动。枚举枚举通过 本质上不是一个线程安全的过程。在枚举枚举与一个或多个写入访问竞争的罕见情况下, 确保线程安全的唯一方法是在整个枚举过程中锁定集合。要允许通过多个 线程访问该集合以进行读写,您必须实现自己的 同步。

+0

+1:和我评论一样:) – leppie 2012-04-02 20:11:58

相关问题