Замок таким образом бесполезен. Вам нужно будет использовать потокобезопасную коллекцию, такую как предложенная Will, или, если вам не нужен доступ для записи, вы можете предоставить только версию вашего списка только для чтения, например:
public ReadOnlyCollection<Character> Characters {
get {
lock (locker) { return this.characters.AsReadOnly(); }
}
}
Эти коллекции не могут быть изменены, поэтому, если ваш тип Character
неизменен, у вас нет проблем с синхронизацией. Если Character
является изменяемым, у вас снова будет проблема, но у вас будет эта проблема даже с потокобезопасной коллекцией. Я надеюсь, что вы знаете об этом. Вы также можете выставить свойство, возвращающее IList<Character>
, но обычно мне лучше сообщить вызывающей стороне, что объект доступен только для чтения.
Если вам нужен доступ для записи, вы также можете сделать это, предоставив соответствующие методы в области действия CharacterManager
и синхронизировав их. Джесси написал хороший пример того, как это сделать.
РЕДАКТИРОВАТЬ: SyncRoot не присутствует на ICollection .