Synchronizacja kolekcji - problem.

0

Witam,
Czy ktoś może mnie naprowadzić co robię tu źle? Chodzi o kolekcję _passengers(lista).
Pojawia się InvalidOperationException - najwyraźniej jeden wątek zmienia kolekcję, drugi próbuje z niej czytać. No ale właśnie - czy locki jakie wprowadziłem do kodu nie powinny temu zapobiec?
2 metody. Pierwsza:

 
 internal void TakePassengers(List<Passenger> awaitingPassengers)
 {             
            lock (_locker) // probowałem też _passengers oraz ICollection list=_passengers i lock(list.SyncRoot)
            {
                    foreach (var passenger in awaitingPassengers)
                    {                       
                            if (CanBeTakenNow(passenger))
                            {
                                _passengers.Add(passenger);
                                CurrentOccupancy++;
                                awaitingPassengers.Remove(passenger);
                            }                       
                    }
             }            
 }

Druga metoda:

 
public List<Passenger> LeavePassengers()
{           
            lock (_locker)
            {                
                List<Passenger> left = new List<Passenger>();
            
                foreach (var passenger in _passengers)
                {
                    if (CanPassengerBeLeft(passenger))
                    {
                        left.Add(passenger);                      
                        _passengers.Remove(passenger);                       
                    }
                }
                return left; 
            }                 
}

Z góry dziękuję za wskazówki.

1
_dj napisał(a)

Pojawia się InvalidOperationException - najwyraźniej jeden wątek zmienia kolekcję, drugi próbuje z niej czytać. No ale właśnie - czy locki jakie wprowadziłem do kodu nie powinny temu zapobiec?

Przeczytaj sobie drugie zdanie z tej strony: http://msdn.microsoft.com/en-us/library/ttw7t8t6.aspx

0

heh... sporo materiałów przejrzałem zanim napisałem wątek, ale tego akurat nie - dzięki.

0

Generalnie w większości kursów piszą o tym, jaki to foreach jest wspaniały zapominając wspomnieć do czego on służy (ani czym tak naprawdę jest, bo niezupełnie pętlą), ani czego nie wolno z nim robić. Stąd bierze się ten najpowszechniejszy błąd związany z użyciem foreach.

0

Treść wyjątku mówi o przyczynie błędu. Ja też się już na to nadziałem, ale po przeczytaniu komunikatu od razu wiedziałem co zrobiłem nie tak. Polecam analizę komunikatu i śladu stosu - oszczędzisz trochę swego czasu ;).

Pozdrawiam.

1 użytkowników online, w tym zalogowanych: 0, gości: 1