2011-06-27 39 views
14

Tôi cần một chức năng như thế này:Danh sách với thời gian chờ/hết hạn khả năng

AddToList(txtName, timeExpire); 

Dường như tự mô tả, mặt hàng sẽ tự động hết hiệu lực và loại bỏ khỏi danh sách.

Tôi không thể tưởng tượng cách thực hiện điều đó. Bất cứ ai có thể cho tôi một đầu mối?

+1

Đây được gọi là 'bộ nhớ cache'. – leppie

+3

đầu mối: tạo cấu trúc dữ liệu để thực hiện điều này – crashmstr

+0

Nếu bạn đang sử dụng asp.net, các lớp bộ nhớ cache sẽ làm điều này cho bạn. –

Trả lời

7

bạn cũng có thể thử một cái gì đó như thế này.

Tạo một lớp tùy chỉnh

public class Custom 
    { 
     string item; //will hold the item 
     Timer timer; //will hanlde the expiry 
     List<Custom> refofMainList; //will be used to remove the item once it is expired 

     public Custom(string yourItem, int milisec, List<Custom> refOfList) 
     { 
      refofMainList = refOfList; 
      item = yourItem; 
      timer = new Timer (milisec); 
      timer.Elapsed += new ElapsedEventHandler(Elapsed_Event); 
      timer.Start(); 
     } 

     private void Elapsed_Event(object sender, ElapsedEventArgs e) 
     { 
      timer.Elapsed -= new ElapsedEventHandler(Elapsed_Event); 
      refofMainList.Remove(this); 

     } 
    } 

Bây giờ bạn có thể tạo List<Custom> và sử dụng nó. Các mục sẽ bị xóa sau khi hết thời gian đã chỉ định.

+0

Một giải pháp tương tự đã hiệu quả với tôi. Trong trường hợp của tôi, tôi tạo ra một singleton để giữ các giá trị được lưu trữ trong một ConncurrentDictionary. Sau đó, tôi sử dụng sự kiện thời gian để xóa các giá trị được lưu trữ thường xuyên. Tôi đã sử dụng hết hạn trượt. –

+2

cách tiếp cận này sẽ làm việc như thế nào trong một api asp.net chạy trong IIS. Tôi tin rằng có những biến chứng với bộ đếm thời gian chạy trong iis? – Zapnologica

3

Bạn sẽ cần phải tạo một đối tượng có thể quản lý việc này.

Hãy suy nghĩ về những gì cần thiết để lưu trữ cho mỗi mục. Về cơ bản, dữ liệu (ví dụ: txtName) và thời gian hết hạn. Điều đó có nghĩa là bạn có thể sẽ cần một lớp hoặc cấu trúc chỉ có 2 phần tử đó.

Lớp học ExpiringList của bạn sẽ là danh sách loại đó.

Bây giờ bạn có cấu trúc dữ liệu cơ bản của mình (bộ sưu tập/danh sách ExpiringListItem), bạn cần phải suy nghĩ về những hoạt động bạn muốn hỗ trợ. Hiện tại bạn đã liệt kê AddToList, những người khác có lẽ sẽ là RemoveFromList, Clear và có thể lặp qua tất cả các mục.

Điều duy nhất duy nhất cho ExpiringList của bạn so với bình thường List<T> là bạn muốn tự động xóa các mục đã hết hạn. Do đó, bạn có thể làm cho ExpiringList của mình triển khai giao diện IList<T> và sử dụng Danh sách riêng trong nội bộ, có thể bạn có thể tạo danh sách của mình (và theo nhu cầu của bạn là loại ExpiredListItem) chung chung.

Phần phức tạp, ngoài hiểu biết và triển khai thừa kế (một câu hỏi riêng biệt thực sự), đang tìm cách xóa các mục đã hết hạn. Điều này có nghĩa là tạo ra một phương thức trong lớp của bạn lặp lại (theo thứ tự ngược lại) trên các mục của bạn, so sánh thời gian hết hạn của chúng với thời gian hiện tại và loại bỏ thời gian hết hạn.

Bạn có thể triển khai giao diện đơn giản bằng cách gọi các phương thức thích hợp trong danh sách nội bộ của mình.

Bạn có thể nói tại thời điểm này, bạn đã hoàn tất, vì bạn chỉ cần gọi phương thức đó định kỳ để đảm bảo tất cả các mục đã hết hạn đều biến mất trước khi bạn sử dụng các mục trong danh sách.

Có thể một tùy chọn tốt hơn là gọi phương thức này trước khi chạy phương thức trên danh sách nội bộ. Tùy thuộc vào cách bạn sẽ sử dụng danh sách của bạn, điều này có thể là quá mức cần thiết.

+1

Tóm lại; Tôi sẽ sử dụng bộ hẹn giờ để kiểm tra các mục hết hạn định kỳ. –

+0

@Nime, có thể hoạt động, hoặc bạn có thể sử dụng gợi ý trong đoạn cuối của tôi (nếu bạn muốn tạo một lớp quản lý này, chứ không phải là một phương thức hoạt động trên danh sách). –

21

Nếu bạn đang nhắm mục tiêu .NET 4 trở lên, hãy sử dụng MemoryCache (hoặc lấy được triển khai tùy chỉnh của bạn từ ObjectCache).

Quay lại trước 4, nếu bạn muốn có bộ nhớ cache trong ứng dụng, bạn có thể chỉ cần chụp System.Web.Cache và sử dụng nó trong bất kỳ ứng dụng .NET nào. Nó không có bất kỳ phụ kiện thực sự nào trên bất kỳ mã "web" nào, nhưng nó yêu cầu bạn tham chiếu System.Web.dll. Nó có vẻ kỳ lạ (như tham khảo Microsoft.VisualBasic.dll từ một ứng dụng C#), nhưng không thực sự ảnh hưởng đến ứng dụng của bạn tiêu cực.

Với sự ra đời của Client Profile, việc phá vỡ các phụ thuộc giữa mã giữa máy tính để bàn và mã trung tâm máy chủ trở nên quan trọng. Vì vậy, ObjectCache đã được giới thiệu để các ứng dụng máy tính để bàn (không chắc chắn về Silverlight, wp7) các nhà phát triển có thể phá vỡ sự phụ thuộc đó và có thể chỉ nhắm mục tiêu hồ sơ khách hàng.

+0

3.5. Tôi sẽ ghi nhớ. –

11

Chỉ cần một ví dụ nhanh cho câu trả lời Will đã

Thêm tham chiếu đến System.Runtime.Caching

MemoryCache cache = new MemoryCache("CacheName"); 

cache.Add(key, value, new CacheItemPolicy() 
          { AbsoluteExpiration = DateTime.UtcNow.AddSeconds(20) }); 

Sau đó bạn có thể kiểm tra xem một cái gì đó vẫn còn trong bộ nhớ cache bằng cách

if (cache.Contains(key)) 

Và nếu bạn muốn bộ nhớ cache của bạn có một giới hạn thời gian thấp thì bạn sẽ cần phải thay đổi thời gian làm mới của bộ nhớ cache với một chút hack đẹp.

MemoryCache AbsoluteExpiration acting strange

+0

bạn có nhận được bộ nhớ cache đồng thời không? Về cơ bản C# 'ConcurrentDictionary' với chức năng hết hạn? – Zapnologica

+2

@Zapnologica MemoryCache hoàn toàn an toàn, xem câu trả lời này: http://stackoverflow.com/a/6738179/606554 – elbweb

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