새 스레드를 트리거하는 동안 이전 값을 제공하도록 proc MVC 캐시를 향상하려고합니다. 값. 내가 선 제거하면Windsor 및 ThreadPool.QueueUserWorkItem : "HttpContext.Current가 null입니다 .PerWebRequestLifestyle은 ASP.Net에서만 사용할 수 있습니다."
이 아래의 코드는 "작동"으로
ThreadPool.QueueUserWorkItem(delegate
를 내가 캐시를 새로 고칠 때까지 캐시 다시로드를 트리거 요청을 클라이언트가 차단되는 것을 의미한다 "작동"하지만, 다른 모든 클라이언트는 섀도우 버전에 대해로드를 계속합니다.
이상 적으로는 캐시 새로 고침을 트리거 한 백그라운드 및 클라이언트에서 해당 요청에 대한 섀도 복사본을 사용하도록 처리해야합니다. 쓰레드가 완료된 후에 그들이 미래의 요청을 할 때 그들은 새로운 캐싱 된 값을 제공받을 것이다.
내 솔루션은 DI 프레임 워크로서 Castle에 크게 의존합니다. 나는 내가 얻고있는 문제가 캐슬의 라이프 스타일즈와 관련이 있다고 믿는다. 오류 메시지 :
HttpContext.Current is null입니다. PerWebRequestLifestyle은 ASP.Net
예외가 장기 실행 프로세스의 창자에 깊은 일 (getCacheItem())이 요구되는 구성 요소를 해결하기 위해 시도 할 때 사용할 수 있습니다. 다음과 같이
내 캐시 방법은 다음과 같습니다
public T GetShadow<T>(string key, Func<T> getCacheItem, int timeOut)
{
if (Exists(key))
{
_log.Info("Shadow: Returning item from Cache: " + key);
return (T)HttpContext.Current.Cache[key];
}
var shadowKey = key + "-shadow";
if (Monitor.TryEnter(GetKeyLock(key)))
{
ThreadPool.QueueUserWorkItem(delegate
{
try
{
var item = getCacheItem(); // Long running query
// Replace the cache entry
HttpRuntime.Cache.Insert(key, item, null,
DateTime.UtcNow.AddMinutes(
timeOut), Cache.NoSlidingExpiration);
// And add its shadow for subsequent updates
HttpRuntime.Cache.Insert(shadowKey, item, null,
DateTime.UtcNow.AddMinutes(timeOut * 2), Cache.NoSlidingExpiration);
}
finally
{
Monitor.Exit(GetKeyLock(key));
}
});
}
while (!Exists(shadowKey))
{
Thread.Sleep(500);
}
return (T)HttpContext.Current.Cache[shadowKey];
}
그래서 내 질문에, 나는 MVC3에서 제대로 스레드 생성을하고있는 중이 야한다?
윈저가 PWR 라이프 스타일로 인해 예외를 발생시키지 않는이 시나리오에서 스레드를 회전시키는 더 좋은 방법이 있습니까?