2012-12-17 2 views
0

1 분 후에 만료되는 캐시가 있다고 가정합니다..Net System.Web.Caching 만료 문제

Cache.Insert("tryin", 0, null, DateTime.Now.AddSeconds(60), Cache.NoSlidingExpiration); 

매 5 초마다 캐시 속도를 1 씩 증가시키는 타이머가 있지만 여기에는 문제가 있습니다. 내가

Cache["tryin"] = Convert.ToInt16(Cache["tryin"]) + 1; 

를 캐시의 값을 업데이트하려면 다음 구문을 사용하는 경우는 캐시를 덮어 NoSlidingExpiration와 NoAbsoluteExpiration와 캐시 [ "노력"을 만들 수 있습니다],하지만 난 캐시가 분 후에 만료되는 것을 원할 것입니다. 나는 또한 다음 구문을 사용하려고 ,

Cache.Insert("tryin", Convert.ToInt16(Cache["tryin"]) + 1, null, DateTime.Now.AddSeconds(60), Cache.NoSlidingExpiration); 

하지만 그것은 만료되지 않습니다 수 있도록 지금까지 오초에 분 후에 만료됩니다 캐시를 ​​생성 끝날이 경우

.

그래서 캐시 만료 시간을 변경하지 않고 캐시 값을 업데이트하거나 남은 만료 시간을 기반으로 다른 캐시를 만들 수 있도록 캐시의 남은 만료를 가져 오는 방법을 찾고 있습니다.

+0

? 일반적으로 캐시 된 값을 수정하고 만료 시간을 변경하지 않는 것은 매우 드문 일입니다. 예 : 데이터를 1 분 동안 캐시 할 수 있고 30 초 후에 데이터를 수정할 수 있다면 확실히 새로운 값이 "신선한"것이므로 이제 1 분 동안 유지할 수 있습니까? – Carson63000

+0

그런 식으로 캐시를 사용하는 것이 "일반적인"경우는 아니지만 캐시의 만료 시간을 업데이트하지 않고 캐시의 값을 업데이트하는 방법이 있는지 알고 싶었습니다. 분명히 만료되기를 원하기 때문입니다. . 캐시를위한 방법이 없다면 내 대안이 무엇인지 물어볼 수 있습니까? –

답변

2

여기서 문제는 캐시 된 항목이 값 유형이라는 것입니다. 당신은 클래스에 정수를 포장 할 수 있습니다

public class ValueHolder 
{ 
    public int Value = 0; 
} 

Cache.Insert("tryin", new ValueHolder(){Value = 0}, null, DateTime.Now.AddSeconds(60), Cache.NoSlidingExpiration); 

다음

정확히 당신이 여기 달성하려는 사용 사례는 무엇
ValueHolder vh = (ValueHolder)Cache["tryin"]; 
if (vh != null) 
    vh.Value = vh.Value + 1; 
+1

이것은 내 제안이기도합니다. 나는 사람들이 참조로 캐시에서 객체를 가져 와서 수정 한 경우 캐시 된 사본을 수정한다는 것을 잊어 버리는 것을 보았습니다. 이 경우에는 그 사실을 당신의 이익에 사용하십시오. :-) – Carson63000