2011-10-04 36 views
5

Tôi có một số BlockingCollection đồng thời với các yếu tố lặp lại. Làm thế nào có thể sửa đổi nó để thêm hoặc nhận các phần tử riêng biệt?Bộ sưu tập đồng thời và các yếu tố độc đáo

+1

Thêm các yếu tố khác biệt có vẻ là [đáng ngạc nhiên khó khăn] (http://stackoverflow.com/questions/6603969/how-to-access-the-underlying-default-concurrent-queue-of-a-blocking-collection) nếu không phải là không thể. 'BlockingCollection' thực hiện' IEnumerable ', vì vậy bạn có thể sử dụng' Distinct() '. –

+0

Bạn có thể sử dụng mã được cung cấp trong câu hỏi StackOverflow được liên kết bởi GertArnold nhưng chỉ đơn giản là luôn trả về true trong triển khai TryAdd và TryTake của một IProducerConsumerCollection. Điều này sẽ làm việc. Tôi biết nó là hình thức khủng khiếp nhưng nó _would_ làm việc, và BlockingCollection đã phá vỡ hình thức ở chỗ nó ném một ngoại lệ. Thật khủng khiếp. – Kevek

Trả lời

4

Cửa hàng sao lưu mặc định cho BlockingCollectionConcurrentQueue. Như một người khác đã chỉ ra, thật khó để thêm các mục riêng biệt bằng cách sử dụng điều đó.

Tuy nhiên, bạn có thể tạo loại bộ sưu tập của riêng mình triển khai IProducerConsumerCollection và chuyển cho nhà xây dựng BlockingCollection.

Hãy tưởng tượng một ConcurrentDictionary có chứa các khóa của các mục hiện có trong hàng đợi. Để thêm một mục, trước tiên bạn gọi TryAdd trên từ điển và nếu mặt hàng đó không có trong từ điển bạn thêm vào, và cũng có thể thêm nó vào hàng đợi. Take (và TryTake) lấy mục tiếp theo từ hàng đợi, xóa nó khỏi từ điển và quay lại.

Tôi thích nếu có đồng thời HashTable, nhưng vì không có một, bạn sẽ phải thực hiện với ConcurrentDictionary.

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