Имейте в виду, что если вы снимаете блокировку в методе GetEnumerator
, вы можете удерживать блокировку очень долгое время, в течение которого никто не сможет добавить объекты в вашу коллекцию:
foreach (var o in myCollection) {
// Do something that takes 10 minutes
}
Вам также нужно подумать о том, что произойдет, если несколько итераций происходят одновременно. Это означает что-то вроде блокировки MRSW (несколько писателей, один писатель), который вам, возможно, придется реализовать самостоятельно.
Похоже, что вам действительно нужно сделать, это перебрать снимок коллекции:
foreach (var o in myCollection.ToArray()) {
// ...
}
Чтобы сделать это правильно, вам нужно реализовать свой собственный ICollection<T>
, который снимает блокировку в ToArray
и Add
методах
Это может помочь, если вы дадите свои требования или спецификации более точно.