Tôi gặp lỗi nghiêm trọng trong mã của mình. Nó cực kỳ hiếm (xảy ra một vài tuần một lần), nhưng nó ở đó và tôi không chắc tại sao.Các vấn đề về hàng đợi .NET đa luồng
Chúng tôi có 2 đề chạy, 1 thread được thông điệp mạng và thêm chúng vào một Queue như thế này:
DataMessages.Enqueue(new DataMessage(client, msg));
chủ đề Một mất thông điệp tắt hàng đợi này và xử lý chúng, như thế này:
while (NetworkingClient.DataMessages.Count > 0)
{
DataMessage message = NetworkingClient.DataMessages.Dequeue();
switch (message.messageType)
{
...
}
}
Tuy nhiên một lần như vậy thường tôi nhận được một NullReferenceException trên dòng switch (message.messageType)
và tôi có thể nhìn thấy trong trình gỡ lỗi thông báo là null.
Không thể đặt giá trị rỗng vào hàng đợi (xem bit đầu tiên của mã) và đây là 2 thứ duy nhất sử dụng hàng đợi.
Hàng đợi không an toàn theo chủ đề, có thể là tôi đang giảm tốc tại thời điểm chính xác mà luồng khác đang đẩy và điều này gây ra trục trặc?
rất ít những thứ trong .NET BCL là thread-safe trong thời trang này. Trong trường hợp này, "để đảm bảo an toàn luồng của Hàng đợi, tất cả các thao tác phải được thực hiện thông qua trình bao bọc được trả về bởi [Đồng bộ hoá] (http://msdn.microsoft.com/en-us/library/system.collections.queue .aspx) phương pháp ". Vấn đề của bạn cũng có thể là hai chủ đề đang enqueueing hoặc dequeueing đồng thời, nếu có. Dù bằng cách nào, chủ đề an toàn là trách nhiệm của bạn. – bzlm
+1, Câu hỏi hay, nó thực sự chứng minh một điều kiện chủng tộc và kết quả của nó (tình huống hư hỏng/không ổn định/không mong muốn). –
Bằng giao diện mã của bạn, có vẻ như bạn đang thực hiện một vòng lặp ngây thơ cho các chuỗi của mình. Bạn nên xem xét việc triển khai một [bộ đệm bị chặn] thích hợp (http://en.wikipedia.org/wiki/Producer-consumer_problem) để đồng bộ hóa điều này. –