2009-12-17 28 views
21

Trên một trang web ASP .NET bận rộn, tôi có một từ điển, hoạt động như một bộ nhớ đệm, về cơ bản lưu trữ các cặp khóa/giá trị để truy xuất sau này.Khi nào một từ điển sẽ mở một IndexOutOfRangeException trên Thêm hoặc Chứa?

Khi tải cao, từ điển một số lần vào trạng thái, tại đó nó luôn ném ra một IndexOutOfRangeException bất cứ khi nào tôi gọi phương thức ContainsKey hoặc Add. Ngoại lệ xảy ra bên trong phương thức FindEntry riêng.

Tôi nghi ngờ rằng điều này có thể do sự cố đồng bộ hóa, nhưng tôi không chắc chắn.

Bất kỳ ai có thể cho tôi biết trong trường hợp nào điều này có thể xảy ra? Mục tiêu của tôi là thu thập đủ thông tin để tôi có thể tái tạo vấn đề trong môi trường dev.

+0

Bạn có ghi đè phương thức *** bằng phương pháp *** hay không, nó cũng được sử dụng nội bộ để so sánh các đối tượng? – serhio

Trả lời

20

Các tài liệu cho Dictionary trạng thái:

Bất kỳ thành viên dụ không đảm bảo được đề an toàn.

Để cho phép bộ sưu tập được truy cập bởi nhiều luồng để đọc và viết, bạn phải triển khai đồng bộ hóa của riêng mình.

Nếu bạn không đồng bộ hóa quyền truy cập vào Dictionary, thì bạn có thể gặp phải các vấn đề như mô tả của bạn (có lẽ do trạng thái nội bộ không còn hiệu lực). Nếu bạn muốn thử và tái tạo điều này trong môi trường phát triển của mình, hãy thử tạo một chương trình sử dụng nhiều luồng để đọc và ghi liên tục từ Dictionary mà không cần đồng bộ hóa.

1

Tôi đồng ý rằng đây gần như chắc chắn là sự cố đồng bộ hóa.

Tôi không biết bất kỳ tài liệu nào mô tả chính xác thời điểm và cách thức điều này có thể xảy ra - hành vi không xác định nếu bạn sử dụng từ điển theo cách không an toàn.

Để thử nghiệm trong môi trường dev, tôi khuyên bạn nên chạy một số luồng song song chèn ngẫu nhiên, loại bỏ, cập nhật vv trong vòng lặp liên tục (về cơ bản là phiên bản "tập trung" của những gì đang xảy ra trong môi trường sản xuất của bạn).

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