2009-08-17 31 views
11

From MSDN về sự khác biệt giữa các Thêm hoặc Chèn một mục các ASP.NET Cache:Tại sao Cache.Add trả về một đối tượng đại diện cho mục được lưu trong bộ nhớ cache?

Note: Add và phương pháp Insert có chữ ký giống nhau, nhưng có khác biệt tinh tế giữa chúng. Trước tiên, gọi phương thức Thêm trả về một đối tượng đại diện cho mục được lưu trong bộ nhớ cache, trong khi gọi Chèn là không phải. Thứ hai, hành vi của họ là khác nếu bạn gọi những phương thức này và thêm một mục vào Bộ nhớ cache là đã được lưu trữ ở đó. Phương thức Insert thay thế mục, trong khi phương thức Thêm không thành công. [nhấn mạnh mỏ]

Phần thứ hai thật dễ dàng. Không có câu hỏi về điều đó.

Nhưng với phần đầu tiên, tại sao nó muốn trả về một đối tượng đại diện cho mục được lưu trong bộ nhớ cache? Nếu tôi đang cố gắng Thêm một mục vào bộ nhớ cache, tôi đã có/biết mục đó là gì?

Tôi không hiểu. Lý do đằng sau điều này là gì?

Trả lời

12

Calling Thêm() trên một bộ nhớ cache cuối cùng gọi một phương pháp nội bộ với chữ ký này:

internal abstract CacheEntry UpdateCache(CacheKey cacheKey, 
    CacheEntry newEntry, bool replace, CacheItemRemovedReason removedReason, 
    out object valueOld); 

Thông báo các out object valueOld - điều này được thiết lập để các đối tượng đó hiện đang trong "cacheKey" vị trí trong bộ nhớ cache, và được trả về là kết quả của Add(). Tài liệu hướng dẫn là gây hiểu nhầm, nó không thực sự giống như đối tượng được trả về - đó là bất kỳ đối tượng nào tại số cùng một vị trí.

này có thể dễ dàng xác minh với đoạn mã sau:

String x = "lorem"; 
String y = "ipsum"; 

HttpContext.Current.Cache.Add("hi", x, null, DateTime.MaxValue, 
           Cache.NoSlidingExpiration, 
           CacheItemPriority.Normal, null); 

var z = HttpContext.Current.Cache.Add("hi", y, null, DateTime.MaxValue, 
           Cache.NoSlidingExpiration, 
           CacheItemPriority.Normal, null); 

//Result: 
// z == "lorem" 
+0

Đó là những gì có ý nghĩa và những gì tôi cho là ban đầu ... có thể ghi đè lên giá trị của một khóa và giá trị cũ được trả về. – kitsune

+0

Để áp phích ban đầu, đây là một cách dễ dàng để kiểm tra xem một đối tượng được lưu trữ đã được cập nhật hay không ... – kitsune

+0

Xin lỗi, tôi đã tìm thấy nhận xét của @ kitsune khó hiểu. Add() sẽ không _override_ giá trị của khóa (đó là những gì Insert() làm). Thay vào đó, Add() sẽ trả về a) giá trị được lưu trữ đã sử dụng khóa đó, HOẶC b) null nếu không có gì ở đó. Đối với (a) nó sẽ hủy bỏ giá trị bạn đang cố gắng thêm vào. – mrcrowl

0

Nó chỉ trả về một đối tượng nếu cùng một đối tượng đã được lưu trữ trong bộ nhớ đệm ( dưới một khóa khác mà tôi đoán là dưới cùng một khóa). Nếu không thì nó trả về null. Các tài liệu là sai lầm:

http://msdn.microsoft.com/en-us/library/system.web.caching.cache.add.aspx

Nhìn vào nó trong suy nghi, cả hai phương pháp dường như gọi cùng một phương pháp nội bộ, với Thanh trả lại đối tượng cũ trước đây được lưu trữ dưới cùng khóa, và các phương pháp INSERT chỉ đơn giản là bỏ qua mà giá trị.

+0

Dude, điều đó không đúng :(Nó thêm một mục nếu nó không có, nếu không nó * không * (expection throw ?? không thể nhớ). Nó cũng trả về một đối tượng. cùng một đối tượng, dưới một phím khác không có ý nghĩa gì .. –

+0

Nó không có, nhưng nó nói như vậy trong tài liệu "Giá trị trả về: Một đối tượng nếu mục đó được lưu trước đó trong Cache; (Không có gì trong Visual Basic). " Nếu nó không thành công nếu đã có một đối tượng được lưu trong bộ nhớ đệm dưới khóa đó, làm thế nào nó có thể nói rằng nó trả về một đối tượng nếu đối tượng đó đã được lưu trong bộ nhớ cache? Dưới khóa nào? Một lần nữa, tôi không không nghĩ rằng điều đó đang xảy ra, vì vậy tài liệu không thực sự hợp lý ... – kitsune

2

Nếu lệnh gọi phương thức Thêm thành công trong việc thêm mục, nó trả về giá trị rỗng.

Nếu khóa đã tồn tại trong bộ nhớ cache, phương thức sẽ trả về một đối tượng. Tuy nhiên, tài liệu không nói nếu nó trả về đối tượng mà bạn đã cố gắng đưa vào bộ nhớ cache hoặc đối tượng đã được lưu trong bộ nhớ cache.

Về mặt logic, nó sẽ trả về đối tượng đã có trong bộ đệm, vì đó là thông tin duy nhất liên tục. Bạn đã có một tham chiếu đến đối tượng mà bạn cố gắng đưa vào bộ nhớ cache.

+0

Cảm ơn bạn đời - bây giờ có ý nghĩa :) –

7

Để làm điều này thậm chí còn rõ ràng hơn, đây là một ứng dụng giao diện điều khiển thể hiện hành vi chính xác:

static void Main(string[] args) 
{ 
    string key = "key"; 

    HttpRuntime.Cache.Add(key, "first", null/*no depends*/, Cache.NoAbsoluteExpiration, Cache.NoSlidingExpiration, CacheItemPriority.NotRemovable, null/*no callback*/); 
    var addResult = HttpRuntime.Cache.Add(key, "second", null/*no depends*/, Cache.NoAbsoluteExpiration, Cache.NoSlidingExpiration, CacheItemPriority.NotRemovable, null/*no callback*/); 

    Console.WriteLine("addResult = {0}", addResult); 
    Console.WriteLine("Cache[key] = {0}", HttpRuntime.Cache[key]); 
} 

Và giao diện điều khiển đầu ra:

 
addResult = first 
Cache[key] = first 

Cuộc gọi "thứ hai" tới .Add trả về những gì hiện có trong Cache dưới khóa của chúng tôi và không cập nhật được mục nhập!

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