Đây không phải là về các phương pháp khác nhau mà tôi có thể hoặc nên sử dụng để sử dụng hàng đợi theo cách tốt nhất, thay vào đó tôi đã thấy điều gì đó không có ý nghĩa với tôi.C# Luồng và Hàng đợi
void Runner() {
// member variable
queue = Queue.Synchronized(new Queue());
while (true) {
if (0 < queue.Count) {
queue.Dequeue();
}
}
}
này được chạy trong một chủ đề duy nhất:
var t = new Thread(Runner);
t.IsBackground = true;
t.Start();
sự kiện khác là "Enqueue" ing những nơi khác. Những gì tôi đã thấy xảy ra là trong một khoảng thời gian, Dequeue sẽ thực sự ném InvalidOperationException, hàng đợi rỗng. Điều này sẽ không thể nhìn thấy như thế nào số lượng đảm bảo có cái gì đó ở đó, và tôi tích cực rằng không có gì khác là "Dequeue" ing.
Câu hỏi (s):
- Có thể rằng Enqueue thực sự làm tăng số lượng trước khi mặt hàng đó là hoàn toàn vào hàng đợi (theo đúng nghĩa ...)?
- Có thể chủ đề đang khởi động lại bằng cách nào đó (hết hạn, đặt lại ...) tại câu lệnh Dequeue, nhưng ngay sau khi nó đã xóa một mục?
Chỉnh sửa (làm rõ):
Những mảnh đang là một phần của một lớp Wrapper mà thực hiện các chủ đề nền helper. Dequeue ở đây là Dequeue duy nhất, và tất cả Enqueue/Dequeue là trên biến thành viên được đồng bộ (hàng đợi).
Vì câu trả lời của Ryan ... đây có phải là mã thực hay chỉ là một ví dụ đơn giản? Nếu nó là mã thực sự, bạn thực sự nên suy nghĩ về việc thay đổi vòng lặp - bỏ phiếu hàng đợi thay vì đồng bộ hóa người đọc với các nhà văn là một thiết kế kém. Bạn đang lãng phí hàng triệu chu trình xử lý để làm nóng phòng. –
Đây là một ví dụ để có được thịt của vấn đề. Có một Thread.Sleep trong đó, bộ xử lý không bị búa. Lý do tôi chọn cho một quá trình bỏ phiếu thay vì đồng bộ đọc/nhà văn là do thực tế là hàng đợi có một cái gì đó trong nó gần như tất cả các thời gian. Trong thân cây của chúng tôi mặc dù tôi đã thêm một AutoResetEvent để chơi xung quanh với. Như tôi đã nói ở trên cùng, tôi không lo lắng về việc triển khai ở đây. Có vẻ như là một vấn đề chính hãng với mô hình luồng này, có thể là đúng hay sai. – neouser99
Từ khi xem mã của bạn, ít nhất bạn cũng có chủ đề chính và chuỗi mà bạn cho rằng Dequeue đang được gọi. Tại sao không đặt tên cho các chủ đề của bạn, và mỗi khi Dequeue được gọi, hãy ghi tên của luồng bằng một dấu vết ngăn xếp. Bạn có thể thấy rằng một cái gì đó trong chủ đề chính là hành xử theo cách bạn không mong đợi. –