2012-04-11 39 views
6

Có một diễn viên từ ConcurrentDictionary đến IDictionary cắt bỏ việc thực hiện an toàn thread, vì IDictionary không có phương thức GetOrAdd và AddOrUpdate?Truyền từ ConcurrentDictionary sang IDictionary

+0

Bạn có ý nghĩa "cắt" chính xác như thế nào? Nó có xóa nó khỏi 'ConcurrentDictionary' không? Không. Nó có sẵn từ giao diện 'IDictionary' không? Số –

+2

@JamesMichaelHare: Anh ấy có nghĩa là, nếu bạn chuyển sang 'IDictionary', nó có làm cho đối tượng kết quả không an toàn không? Nói cách khác, nó biến nó thành một từ điển thông thường? –

+0

Thiết bị có an toàn không? Có nguy hiểm vì nó có thể được mà không có những hoạt động. Đó là, nếu bạn cần một nguyên tử 'GetOrAdd()' bạn sẽ được ra khỏi may mắn. –

Trả lời

10

Đối tượng kết quả sẽ vẫn là một từ điển đồng thời. Các cuộc gọi như Thêm hoặc Xóa sử dụng triển khai bên dưới TryAdd và TryRemove (an toàn chỉ chuỗi). Việc truyền một đối tượng sang một kiểu khác không thay đổi chính đối tượng đó.

Ngoài ra, để làm rõ, bạn có thể sử dụng các công cụ như ILSpy để xem việc thực hiện các phương pháp IDictionary mặc định là những gì và liệu họ sẽ vẫn thread-safe.

+0

Bạn cũng có thể xem tài liệu MSDN cho triển khai của 'IDictionary ' phương pháp ConcurrentDictionary của: http://msdn.microsoft.com/en-us/library/dd287191.aspx – phoog

6

IDictionary chỉ là một giao diện. Nếu bạn truyền đến nó, kết quả là việc triển khai ConcurrentDictionary, thiếu các phương thức GetOrAddAddOrUpdate.

Có lẽ, bạn vẫn có thể sử dụng Item bất động sản và các AddContainsKey phương pháp (thay cho GetOrAddAddOrUpdate) phương pháp, và đối tượng đúc của bạn vẫn sẽ được thread-safe (kể từ khi thực hiện cơ bản là một ConcurrentDictionary).

1

Giao diện không ảnh hưởng đến việc triển khai. Nó chỉ không tiếp xúc với một số phương pháp của ConcurrentDictionary.

Bạn có thể tìm thấy this hoặc this hữu ích trong việc hiểu giao diện.

0

Nó sẽ giống như nhìn vào đối tượng lớn ConcurrentDictionary qua IDictionary lỗ khóa hình - bạn chỉ có thể nhìn thấy hình dạng IDictionary nhưng nó vẫn sẽ là ConcurrentDictionary.

-1

Trả lời ngắn gọn.

Bạn đang thao tác một đối tượng thông qua giao diện và do đó vẫn sử dụng triển khai cụ thể. Bạn không mất bất kỳ chức năng cũng như phương pháp của nó. Họ chỉ là không có sẵn.

Trên mặt lưu ý, bạn cần một diễn viên rõ ràng khi downcasting, không cần cho một diễn viên rõ ràng khi upcasting - luôn luôn an toàn để làm như vậy.

+0

xin lỗi nhưng ConcurrentDictionary thêm hai mới phương pháp và ẩn những người khác, do đó, việc triển khai của nó có thể thêm chủ đề an toàn chỉ cho các phương pháp mới, chứ không phải cho các phương thức ẩn. Tài liệu MSDN không làm rõ nó, vì vậy tôi hỏi nó.Nhưng sau khi tôi đọc những bình luận tốt nhất và tôi đã xem xét nguyên mẫu ConcurrentDictionary, tôi thấy nó không mở rộng từ điển, và điều này khiến tôi yên tâm rằng việc truyền nó sang IDictionary sẽ gián tiếp sử dụng từ điển phiên bản mở rộng. – Luciano

Các vấn đề liên quan