【问题标题】:Under what circumstances would SynchronizedCollection<T>.Remove() return false?在什么情况下 SynchronizedCollection<T>.Remove() 会返回 false?
【发布时间】:2016-12-19 23:27:33
【问题描述】:

SynchronizedCollection&lt;T&gt;.Remove() (https://msdn.microsoft.com/en-us/library/ms619895(v=vs.110).aspx) 的 MSDN 文档声明此函数返回

如果项目已成功从集合中删除,则为 true;否则为假。

如果项目不在列表中,在其他什么情况下会返回 false?

例如,如果集合被锁定,它会返回false 还是会等到它被解锁才能移除该项目?

【问题讨论】:

  • 除非项目不在列表中本身就是一个竞争条件。

标签: c# multithreading


【解决方案1】:

如果它可以获取一个锁,然后如果该项目存在于集合中,它将返回 true。否则它将返回false。

您可能调用了 Remove(),但其他线程正在处理该集合,您无法获得锁。该其他线程可能会在您获得锁定之前删除该项目。获得锁后,该项目已被移除,因此它将返回 false

在下面的代码中,很明显,当您调用Remove 时,它会尝试获取锁,如果不成功,它将等待直到可用。一旦可用,它将检查该项目是否仍然存在。如果不是,则返回false。如果是,它会调用RemoveAt

这是支持我上面所说的SynchronizedCollection&lt;T&gt;类源代码的代码:

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 );
}

【讨论】:

    猜你喜欢
    • 2015-03-06
    • 1970-01-01
    • 1970-01-01
    • 2016-03-02
    • 2018-04-26
    • 2011-03-20
    • 2020-02-07
    • 2020-11-04
    • 1970-01-01
    相关资源
    最近更新 更多