2012-02-22 2 views
8

NHibernate経由で入力されているエンティティクラスにList<T>があります。そのリストに.Clear()と電話すると、私はIndexOutOfRangeExceptionになります。呼び出しリスト<T> .Clear()が原因でIndexOutOfRangeExceptionが発生しました。

このリストには、これが呼び出される前に項目があることが確認されていますが、同じ例外がスローされます。

このメソッドを呼び出すと、どのような場合にこの例外が発生すると思われますか?

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

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

編集:

狂気の事は例外がスローされ、私は、デバッガを破るされた後であっても、私はすぐにウィンドウ内のオブジェクトを照会することができますし、カウント()メソッドが返していることを確認することができるということです値5!

+0

可能な重複http://stackoverflow.com/questions/1429562/problem-with-clearing-a-listt。 – Alex

+0

は、例外またはNHibernateをスローするコレクションですか? – Jaguar

+0

NHibernateは例外をスローしません。 Exceptionプロパティを見れば、それについて言及されていません。 – starskythehutch

答えて

7

典型的なケースは、複数のスレッドが同じリストにアクセスしている場合です。

リストが別のスレッドによってクリアされている間にあるスレッドが項目を削除した場合、この例外がスローされる可能性があります。

List<T>クラスがではなく、スレッドセーフであることを覚えておいてください。

+0

あなたの答えをありがとうが、私はマルチスレッドの何もしていない。それは空想的な何もしていない沼地の標準の小さなウェブアプリです。 – starskythehutch

+0

私はスレッドセーフリストを実装して、それを完全に排除して報告するだけです!リンクありがとう。 – starskythehutch

0

スレッドを使用している場合は、メソッドClear()の呼び出しをロックしてください。マルチスレッドの問題の場合は

private readonly object obj = new Object(); 

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

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

並行コレクションを使用する方が効率的です。 http://msdn.microsoft.com/en-us/library/dd997305.aspx –

関連する問題