0

새 스레드를 트리거하는 동안 이전 값을 제공하도록 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 라이프 스타일로 인해 예외를 발생시키지 않는이 시나리오에서 스레드를 회전시키는 더 좋은 방법이 있습니까?

답변

2

내 질문은 MVC3 내에서 올바르게 스레드 생성을 수행하고 있습니까 ??

아니요, ASP.NET 응용 프로그램의 배경 스레드에 HttpContext.Current을 사용하고 있습니다. 귀하의 문제는 Windsor와 ASP.NET MVC와는 아무런 관련이 없습니다. 백그라운드 스레드 (이름에서 알 수 있듯이)가 모든 사용자 HTTP 컨텍스트 외부의 백그라운드에서 실행될 수 있기 때문에 단순히 할 수없는 것입니다. 그런 스레드 내에서이 컨텍스트에 액세스하려고 시도하는 것은 의미가 없습니다.

ASP.NET과 독립적으로 사용하도록 설계된 새로운 MemoryCache 클래스 덕분에 .NET 4.0의 새로운 캐싱 기능을 사용할 수 있습니다.

관련 문제