SynchronizedCollection<T>.Remove()(https://msdn.microsoft.com/en-us/library/ms619895(v=vs.110).aspx)的MSDN文档声明此函数返回
如果项目已从集合中成功删除,则为true; 否则,错误.
除了项目不在列表中之外,在其他情况下这将返回错误吗?
例如,如果集合被锁定,它会返回false还是等到它被解锁以删除该项目?
如果它可以获取一个锁,然后如果该项存在于集合中,它将返回true.否则它将返回false.
您可以调用Remove(),但是其他一些线程正在处理集合而您无法获得锁定.其他线程可能会在您获得锁定之前删除该项目.一旦你有了一个锁,那时该项目已被删除,因此它将返回false.
在下面的代码中,当你调用Remove它时尝试获取一个锁是很明显的,如果没有成功,它会等到它可用.一旦可用,它将检查该项目是否仍在那里.如果没有,它会返回false.如果是,它会打电话RemoveAt.
以下是从SynchronizedCollection<T>类的源代码中支持我上面所说的代码:
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 );
}
Run Code Online (Sandbox Code Playgroud)