Tại sao SynchronizedCollection<T>
không có được một khóa trên SyncObj trong việc thực hiện rõ ràng của IEnumerable.GetEnumerator()
Tại sao SynchronizedCollection <T> không khóa trên IEnumerable.GetEnumerator()
IEnumerator IEnumerable.GetEnumerator()
{
return this.items.GetEnumerator();
}
thực hiện ngầm không có được một khóa trên SyncOb (xác nhận qua sự phản xạ).
Nó có thể là vấn đề trong vòng lặp foreach trên bộ sưu tập này. Một chủ đề có thể đã có được một khóa và người kia có thể thử đọc nó bằng cách sử dụng foreach?
Tôi nghĩ điều mà anh ta đề cập đến là việc thực thi ngầm của GetEnumerator() thực sự gọi là khóa. – user7116
Thật vậy. Silly, không có gì cần phải bị khóa. Tham chiếu danh sách nội bộ không thể thay đổi, chỉ nội dung của nó. Trình vòng lặp chỉ lưu trữ tham chiếu danh sách. –
Tôi tin rằng nó nên bởi vì một cuộc gọi đến 'GetEnumerator()' cuối cùng tạo ra một mới 'Enumerator' dựa trên trường 'List ._version'. –
user7116