2012-08-30 32 views
6

Tôi đang sử dụng vấn đề Người tiêu dùng sản xuất và có BlockingCollection mà tôi tạo dữ liệu và sử dụng ngày từ nó. Tôi gọi một methode để tạo ra dữ liệu và thiết lập blockingcollection thành CompleteAdding để người tiêu dùng tiêu thụ tất cả dữ liệu từ BC (blockingcollection), và sau khi xử lý một số ứng dụng muốn thêm một số dữ liệu khác vào BC, nhưng nó không thể vì nó được đặt thành CompleteAdding, làm thế nào tôi có thể đặt CompleteAdding thành false, hoặc làm thế nào tôi có thể tiêu thụ tất cả dữ liệu từ BC, chứ không phải chờ đợi cho ComleteAdding?Thêm vào BlockingCollection sau khi CompleteAdding được gọi là

Cảm ơn.

Trả lời

10

Bạn không thể - toàn bộ điểm gọi CompleteAdding là để nói, "Sẽ không bao giờ có thêm bất kỳ dữ liệu nào được thêm vào bộ sưu tập này. Khi nó trống, bạn biết bạn đã hoàn tất." Những gì bạn đang yêu cầu là một chút giống như nói, "Sau khi tôi đã đóng một kết nối mạng, làm thế nào tôi có thể mở lại nó để tôi có thể viết nhiều dữ liệu hơn?"

Thực tế là bạn muốn để đề xuất bạn nên suy nghĩ lại về thiết kế của mình. Có lẽ bạn nên tạo mới BlockingCollection tại thời điểm này thay thế? Hoặc có thể bạn không thực sự muốn gọi CompleteAdding để bắt đầu?

+0

Nhưng nếu tôi không gọi cho CompleteAdding, vòng lặp kết thúc như thế nào? bởi vì tôi sử dụng vòng lặp wiht .GetConsumingEnumerable() property – XandrUu

+0

@XandrUu: Nói chung, điều đó không đúng, vì bạn muốn đưa thêm dữ liệu vào. Nếu bạn muốn một ý tưởng "hoàn thành loạt này", bạn có thể muốn xem xét giá trị sentinel ... hoặc có một bộ sưu tập cho mỗi lô. –

+0

@JonSkeet điều gì sẽ là usecase để gọi nó, tức là: tại sao bạn sẽ giới hạn mình để nói, bộ sưu tập này được đóng lại? – koenmetsu

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