2016-12-19 12 views
7

dokumentacji MSDN dla SynchronizedCollection<T>.Remove() (https://msdn.microsoft.com/en-us/library/ms619895(v=vs.110).aspx) stwierdza, że ​​ta funkcja zwracaW jakich okolicznościach funkcja SynchronizedCollection <T> .Remove() zwróci false?

true, jeśli element został pomyślnie usunięty z kolekcji; w przeciwnym razie false.

Inne niż, jeśli przedmiot nie znajduje się na liście, pod jakimi innymi okoliczności ten zwrot byłby nieprawdziwy?

Na przykład, jeśli kolekcja jest zablokowana, czy zwróci false lub czy będzie czekać, aż zostanie odblokowana, aby usunąć przedmiot?

+0

_Other niż wtedy, gdy przedmiot nie jest w list_ jest warunkiem rasa sama. –

Odpowiedz

5

Jeśli może uzyskać blokadę, a następnie jeśli pozycja istnieje w kolekcji, zwróci true. W przeciwnym razie zwróci false.

Możliwe jest wywołanie metody Remove(), ale inny wątek pracuje nad kolekcją i nie można uzyskać blokady. Ten inny wątek może usunąć przedmiot, zanim zdobędziesz blokadę. Kiedy już posiadasz zamek, w tym momencie przedmiot został usunięty, więc powróci false.

W poniższym kodzie jest jasne, gdy zadzwonisz pod numer Remove, który próbuje uzyskać blokadę, jeśli nie zakończy się pomyślnie, poczeka, aż będzie dostępna. Gdy będzie dostępny, sprawdzi, czy przedmiot nadal tam jest. Jeśli nie, zwraca false. Jeśli tak, zadzwoni pod numer RemoveAt.

Oto kod do wsparcia, co mówię powyżej z kodu źródłowego klasy za 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); 
}