2011-11-18 40 views
12

Nếu tôi có mộtChủ đề An toàn với từ điển

Dictionary<int, StreamReader> myDic = new Dictionary<int, StreamReader> 
//Populate dictionary 

Một chủ đề không

myDic[0] = new StreamReader(path); 

chủ đề khác không

myDic[1] = new StreamReader(otherpath) 

là chủ đề này an toàn vì mục thực tế trong từ điển nhận được đã sửa đổi khác với chủ đề khác hoặc tôi sẽ nhận được InvalidOperationException: Collection was modified

Trả lời

18

Bạn sẽ chỉ nhận được InvalidOperationException: Collection was modified nếu bạn liệt kê từ điển trong khi sửa đổi.

Tuy nhiên, đó không phải là chủ đề an toàn.
Nếu một trong các hoạt động đó làm cho từ điển đổi kích thước, một từ khác có thể bị mất.
Thay vào đó, hãy sử dụng ConcurrentDictionary.

+0

, Nếu tôi có cuncorrentDictionary và tôi cần phải kiểm tra containsKey và sau đó làm điều gì đó nếu đúng: sau đó tôi vẫn sẽ phải khóa nó: 'khóa (locker) { if (MyConDic.ContainsKey (toUserName)) {...}} '.... không? –

+0

@RoyiNamir: Điều đó đánh bại toàn bộ mục đích của 'ConcurrentDictionary'. Sử dụng API của nó – SLaks

+0

Nhưng những người bảo đảm rằng trong dòng 96 có wont được một sợi mà sẽ thêm entery? Http: //i.stack.imgur.com/MwDuU.jpg? xin vui lòng xây dựng –

1

Để cải thiện mã của bạn, bạn có thể muốn tìm kiếm lớp học ConcurrentDictionary. Nó sẽ giải quyết một số vấn đề với đa luồng.

5

System.Collections.Generic bộ sưu tập chỉ là chủ đề an toàn nếu bạn đang đọc từ nhiều chủ đề.

Trích dẫn từ MSDN

lớp học tập System.Collections.Generic không cung cấp bất kỳ đồng bộ hóa thread; mã người dùng phải cung cấp tất cả đồng bộ hóa khi ghi được thêm vào hoặc gỡ bỏ trên nhiều chủ đề đồng thời

Nếu bạn muốn muốn an toàn thread cho cả đọc và ghi các hoạt động xem xét sử dụng System.Collections.Concurrent

* Khi bạn viết mã mới, sử dụng các lớp thu thập đồng thời bất cứ khi nào bộ sưu tập sẽ ghi vào nhiều luồng đồng thời. *