0

有一个从另一个线程写入的项目列表。

项目被同步删除。我在删除部分有以下 lambda

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

有时,我会得到 d 的 NullReferenceException。

我怎样才能了解更多信息?

有关上下文的更多信息

删除或添加时,我有一个简单的锁 lock(myLock) 在添加部分,我已经检查了项目是否为空(if (item != null) )

在 where 子句中有一个简单的 (d != null) 不会阻止项目首先变为 null。在我看来,该列表应该已经处于“适当的状态”。

4

2 回答 2

1

线程与否,引用中的引用始终可以为空。如果要从同一个列表中删除项目,则需要先锁定项目(或集合),然后再对其进行处理。

没有多线程:

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 是否为空

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