- Tôi có một ConcurrrentDictionary được tạo như một đối tượng ứng dụng trong ứng dụng web của tôi. và được chia sẻ giữa các phiên. (Về cơ bản phục vụ như một kho lưu trữ.)
- Đôi khi một mục mới được thêm vào từ điển bởi bất kỳ phiên có sẵn nào.
Allow Admin Xem ChỉKhi Iterating Over ConcurrentDictionary và chỉ đọc, là ConcurrentDictionary bị khóa?
Bây giờ, tôi muốn cho phép một admin để liệt kê tất cả các giá trị trong từ điển, nhưng quản trị sẽ không thêm hoặc xoá các mục, thay vào đó tôi sẽ chỉ cung cấp một cách để quản trị viên xem các mục qua đọc của bộ sưu tập bằng cách lặp qua các mục.
(Pseudo) Mã sẽ giống như này:
foreach (var e in EmployeeCache.Instance.AllEmployees)
{
Console.WriteLine(e.Key);
}
Câu hỏi của tôi là thế này:
Nếu tôi lặp qua các mục nào ConcurrentDictionary bị khóa trong khi nó đang được đọc từ? Nói cách khác, là ConcurrentDictionary bị khóa để các phiên khác sẽ không thể thêm hoặc loại bỏ trong khi mã quản trị chỉ đơn giản là lặp qua ConcurrentDictionary?
Nếu không bị khóa, bạn có thể giải thích
Nếu bạn tin rằng nó không bị khóa, bạn có thể cho một bản tóm tắt nhanh chóng của nó như thế nào thực hiện điều này? Ví dụ, nó có tạo ra một bản sao của ConcurrentDictionary cho hành động chỉ đọc và sau đó cho phép đọc lặp lại - hiểu rằng những thay đổi đồng thời với từ điển thực sẽ không được nhìn thấy?
Những gì tôi đang cố gắng xác định
Tôi đang cố gắng để hiểu được tác động của việc cung cấp một xem ConcurrentDictionary có thể được làm mới thường xuyên bởi một quản trị. I E. Nếu họ làm mới nó thường xuyên đủ có thể ảnh hưởng đến hiệu suất của ứng dụng web. khi phiên đang chờ đối tượng mở khóa để họ có thể thêm/xóa các mục?
* Yuval, Cảm ơn. Đó là những gì tôi đã tự hỏi. Cảm ơn bạn rất nhiều vì đã dành thời gian đọc bài đăng của tôi và tập trung vào những gì tôi đã hỏi. Tôi sẽ đợi, nhưng tôi sẽ đánh dấu đây là câu trả lời trong những ngày tiếp theo. Cảm ơn một lần nữa vì một câu trả lời tốt và được viết tốt. – raddevus
Tại sao có 'Volatile.Read' (hàng rào bộ nhớ) cho' current = buckets [i] '? Chắc chắn, có một bình luận nhưng tôi không hiểu nó. – tigrou
Tôi tìm thấy câu trả lời: Trong C# tất cả các lần đọc là không dễ bay hơi, nó có nghĩa là nếu một biến đã được thay đổi trong một chủ đề, nó vẫn có thể không được phản ánh trong một chủ đề khác (vì bộ nhớ đệm/tối ưu hóa). 'Volatile.Read' đảm bảo mới nhất, giá trị mới nhất được lấy ra. Đây là những gì chúng ta muốn ở đây trong khi đọc 'buckets [i]' – tigrou