2012-02-22 27 views
8

Tôi có một số List<T> nằm trong một lớp thực thể đang được điền thông qua NHibernate. Khi tôi gọi .Clear() trong danh sách đó, tôi nhận được số IndexOutOfRangeException.Danh sách gọi <T> .Clear() gây ra IndexOutOfRangeException

Tôi đã xác minh rằng danh sách đó có các mục trong trước khi được gọi, nhưng ngoại lệ tương tự cũng được ném.

Trong trường hợp nào bạn mong đợi nhận ngoại lệ này khi bạn gọi phương thức này?

private readonly List<VacancyTag> _vacancyTags = new List<VacancyTag>(); 

public virtual void RemoveAllVacancyTags() 
{ 
    _vacancyTags.Clear(); 
} 

Edit:

Điều điên là ngay cả sau khi ngoại lệ được ném và tôi phá vỡ các chương trình gỡ rối, tôi có thể truy vấn các đối tượng trong cửa sổ ngay lập tức và có thể khẳng định rằng phương pháp Count() đang trở lại giá trị 5!

+0

Có thể trùng lặp http://stackoverflow.com/questions/1429562/problem-with-clearing-a-listt trong trường hợp xảy ra sự cố đa luồng. – Alex

+0

là bộ sưu tập có ném ngoại lệ hoặc NHibernate? – Jaguar

+0

Nó không phải là NHibernate ném ngoại lệ. Nhìn qua các thuộc tính Ngoại lệ, không có đề cập đến nó. – starskythehutch

Trả lời

7

Trường hợp điển hình là khi bạn có nhiều chuỗi truy cập cùng một danh sách.

Nếu một chủ đề xóa mục trong khi danh sách đang bị xóa bởi một chuỗi khác, ngoại lệ này có thể bị ném.

Hãy nhớ rằng lớp List<T>không phải là an toàn chỉ.

+0

Cảm ơn câu trả lời của bạn, nhưng tôi không làm bất cứ điều gì đó là đa luồng. Đó là một ứng dụng web nhỏ gọn chuẩn mà không làm gì lạ mắt. – starskythehutch

+0

Tôi sẽ triển khai danh sách an toàn chỉ, chỉ để hoàn toàn loại bỏ nó ra và báo cáo lại! Cảm ơn các liên kết. – starskythehutch

0

Nếu bạn đang sử dụng chủ đề, vui lòng khóa cuộc gọi của phương thức Clear().

private readonly object obj = new Object(); 

private readonly List<VacancyTag> _vacancyTags = new List<VacancyTag>(); 

public virtual void RemoveAllVacancyTags() 
{ 
    lock(obj) 
    { 
     _vacancyTags.Clear(); 
    } 
} 
+0

Tốt hơn hãy thử sử dụng một bộ sưu tập đồng thời. http://msdn.microsoft.com/en-us/library/dd997305.aspx –

Các vấn đề liên quan