Tôi đã sử dụng lại danh sách người tiêu dùng sản xuất ví dụ từ C# trong cuốn sách Nutshell của Albahari (http://www.albahari.com/threading/part5.aspx#_BlockingCollectionT) và một đồng nghiệp đã nhận xét: "Tại sao không được gọi là trên BlockingCollection trong việc vứt bỏ của bộ sưu tập? "Gọi Dispose trên một BlockingCollection <T>
Tôi không thể tìm thấy câu trả lời và lý do duy nhất tôi có thể đưa ra là việc thực hiện khối lượng công việc còn lại của hàng đợi sẽ không được xử lý. Tuy nhiên, khi tôi xử lý hàng đợi, tại sao nó sẽ không ngừng xử lý?
Bên cạnh "Tại sao bạn không nên vứt bỏ BlockingCollection?" Tôi cũng có một câu hỏi thứ hai "Liệu nó có hại nếu bạn không vứt bỏ một BlockingCollection?". Tôi cho rằng khi bạn đang sinh sản/xử lý nhiều hàng đợi của người tiêu dùng sản xuất, nó sẽ gây ra các vấn đề (không phải tôi muốn điều đó mà chỉ vì nguyên nhân của việc biết). Theo What does BlockingCollection.Dispose actually do? BlockingCollection chứa hai tay cầm chờ đợi (hiển nhiên) nên không gọi Dispose sẽ cho bạn một số vấn đề. Cảm ơn ken2k đã chỉ ra điều này.
Mã Tôi đang nói về:
public class PCQueue : IDisposable
{
BlockingCollection<Action> _taskQ = new BlockingCollection<Action>();
public PCQueue (int workerCount)
{
// Create and start a separate Task for each consumer:
for (int i = 0; i < workerCount; i++)
Task.Factory.StartNew (Consume);
}
public void Dispose() { _taskQ.CompleteAdding(); }
public void EnqueueTask (Action action) { _taskQ.Add (action); }
void Consume()
{
// This sequence that we’re enumerating will block when no elements
// are available and will end when CompleteAdding is called.
foreach (Action action in _taskQ.GetConsumingEnumerable())
action(); // Perform task.
}
}
Có thể liên quan: http://stackoverflow.com/questions/3188601/what-does-blockingcollection-dispose-actually-do – ken2k
Tôi gặp sự cố với việc hủy bỏ việc thu thập chặn (ví dụ: giải phóng thời gian Take last), cho đến khi tôi bắt đầu sử dụng CancellationToken, xem https://stackoverflow.com/a/5759866/1544054 – Aviko