Một hơi muộn, nhưng đây là một trường hợp sử dụng có liên quan:
tôi cần phải bộ nhớ cache hai loại đối tượng: lớn (deserialised) tập tin dữ liệu mà mất 10 phút để tải và 15G chi phí của ram mỗi, và nhỏ hơn (động được biên dịch) các đối tượng chứa tham chiếu nội bộ cho các tệp dữ liệu đó (các đối tượng nhỏ hơn cũng được lưu trong bộ nhớ cache vì chúng mất ~ 10 giây để tạo). Các kho lưu trữ này được ẩn trong các nhà máy cung cấp các đối tượng (thành phần cũ không có kiến thức về các đối tượng này) và có các chính sách trục xuất khác nhau.
Khi bộ nhớ cache `dữ liệu 'của tôi gợi lên một đối tượng, nó thay thế nó bằng tham chiếu yếu, vì vậy nếu đối tượng đó vẫn có sẵn khi được yêu cầu tiếp theo, chúng tôi có thể phục hồi lại (và gia hạn thời gian chờ bộ nhớ cache). Bằng cách này, chúng tôi tránh mất (hoặc vô tình nhân đôi) bất kỳ đối tượng nào trước khi nó thực sự không còn tồn tại (tức là không được sử dụng ở bất kỳ nơi nào khác). Lưu ý rằng không yêu cầu bộ nhớ cache để nhận thức được bộ nhớ khác và không có đối tượng khách hàng nào khác cần lưu ý rằng có bất kỳ bộ đệm nào (ví dụ: chúng ta tránh cần các 'keepalives', callbacks, registration, retrieve-and-return scope , v.v. - mọi thứ trở nên đơn giản hơn rất nhiều). Vì vậy, mặc dù sử dụng WeakReference (thay vì cache) là một ý tưởng khủng khiếp (vì GC hiện đại thường được điều chỉnh theo kích thước của cache L2 CPU, và mã thông thường sẽ ghi qua nhiều lần trong một phút), đó là rất hữu ích như một cách để ẩn bộ nhớ cache của bạn từ phần còn lại của mã.
"một tá trên CodePlex" ... và một trong Khung. ASP.NET Cache System.Web.Caching.Cache có thể được sử dụng trong các ứng dụng non -ASP.NET và khá mạnh mẽ. Microsoft tài liệu nói rằng nó không được khuyến cáo sử dụng nó trong các ứng dụng của khách hàng (nhưng không thực sự nói lý do tại sao), nhưng tôi đã sử dụng nó trong một loạt các ứng dụng thành công. – Joe
Tôi đã thử HttpRuntime.Cache, nhưng nó không hoạt động như tôi muốn.Tôi liên tục thêm các mục vào bộ nhớ cache và sớm nhận được một OutOfMemoryException thay vì có các mục gỡ bỏ bộ nhớ cache. – Rauhotz
"HttpRuntime.Cache, nhưng nó không hoạt động như tôi thích ... OutOfMemoryException". Đáng ngạc nhiên, nhưng bạn có thể thử điều chỉnh cấu hình bộ nhớ cache - ví dụ: privateBytesLimit và percentPhysicalMemoryUsedLimit properties. Hoặc có thể có một số lý do khác cho OutOfMemoryException. – Joe