0

別のスレッドから書き込まれるアイテムのリストがあります。

アイテムは同期的に削除されます。削除部分に次のラムダがあります

var deleteList = this.Items.Where(d => d.Id == guid).ToList();

時々、dに対してNullReferenceExceptionが発生します。

どうすればそれについてもっと知ることができますか?

コンテキストに関する詳細情報

削除または追加するときは、単純なロックロック(myLock)があります。追加部分では、アイテムがnullかどうかをすでに確認しています(if(item!= null))

where句に単純な(d!= null)を含めても、そもそもアイテムがnullになるのを防ぐことはできません。私の意見では、リストはすでに「適切な状態」になっているはずです。

4

2 に答える 2

1

スレッド化するかどうかに関係なく、参照内の参照は常に null になる可能性があります。同じリストからアイテムを削除する場合は、作業する前にアイテム (またはコレクション) をロックする必要があります。

マルチスレッドなし:

var deleteList = this.Items.Where(d => d != null && d.Id == guid).ToList();

コレクションを次のようにロックします (これにはさまざまな方法があることに注意してください)。

lock(this.Items)
{
    var deleteList = this.Items.Where(d => d != null && d.Id == guid).ToList();
}
于 2012-07-26T07:57:20.067 に答える
0

d が null かどうかを確認するチェックを追加してみてください

d => d != null && d.Id.Equals(guid)
于 2012-07-26T08:00:22.860 に答える