在什么情况下,SynchronizedCollection<T>.Remove() 会返回 false?

8
< p > SynchronizedCollection<T>.Remove() 的 MSDN 文档 (https://msdn.microsoft.com/en-us/library/ms619895(v=vs.110).aspx) 表示该函数返回

如果成功从集合中删除 item,则返回 true;否则返回 false。

除了不在列表中的项目之外,还有哪些情况会返回 false?

例如,如果集合被锁定,它会返回 false 还是会等待解锁后再将项目删除?


除非该项目不在列表中,否则这本身就是一种竞争条件。 - H H
1个回答

5
如果它可以获取锁并且集合中存在该项,则返回true。否则,返回false。
可能会调用Remove(),但其他线程正在处理该集合,您无法获得锁。在您获得锁之后,该项已被删除,因此它将返回false。
在下面的代码中,当您调用Remove时,很明显它会尝试获取锁,如果不成功,它将等待直到可用。一旦可用,它将检查该项是否仍然存在。如果不存在,则返回false。如果存在,则调用RemoveAt。
以下是支持我上述说法的代码来自SynchronizedCollection类的源代码:
public bool Remove(T item) {
   lock( this.sync ) {
      int index = this.InternalIndexOf( item );
      if( index < 0 )
         return false;

      this.RemoveItem( index );
      return true;
   }
}

protected virtual void RemoveItem(int index) {
   this.items.RemoveAt( index );
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接