2016-12-19 5 views
7

SynchronizedCollection<T>.Remove()https://msdn.microsoft.com/en-us/library/ms619895(v=vs.110).aspx)のためのMSDNドキュメントは、アイテムが正常にコレクションから削除された場合、この関数はSynchronizedCollection <T> .Remove()はどのような状況でfalseを返しますか?

trueを返すと述べています。それ以外の場合はfalseです。

このアイテムがリストに含まれていない場合を除き、これ以外の状況ではfalseが返されますか?

たとえば、コレクションがロックされている場合は、falseを返しますか、アイテムを削除するためにロックが解除されるまで待機しますか?

+0

_Otherは、それ自体で競合状態です。 –

答えて

5

ロックを取得でき、アイテムがコレクションに存在する場合はtrueを返します。それ以外の場合はfalseを返します。

Remove()を呼び出すことはできますが、他のスレッドがコレクションで作業していてロックを取得できない可能性があります。他のスレッドは、ロックを取得する前にアイテムを削除することがあります。ロックを解除すると、その時点でアイテムは削除されたので、falseが返されます。

以下のコードでは、Removeにロックを取得しようとすると、それが利用可能になるまで待つことになります。利用可能になると、アイテムがまだ存在するかどうかがチェックされます。そうでない場合はfalseを返します。はいの場合はRemoveAtとなります。

ここで私はSynchronizedCollection<T>クラスのソースコードから上記の言っているものをサポートするためのコードされています。項目がlist_ではない場合よりも

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); 
} 
関連する問題