2011-11-04 5 views
0

ASP.NET MVC 3 (.NET 4) 웹 응용 프로그램이 있습니다.비동기 스레드를 실행 취소하고 캐시에 데이터 저장

이 응용 프로그램은 Oracle 데이터베이스에서 데이터를 가져 와서 일부 정보를 다른 Sql 데이터베이스와 혼합합니다.
많은 테이블이 함께 결합되어 많은 데이터베이스 읽기가 필요합니다.
나는 이미 내가 가져올 수있는 최선을 최적화했으며 그 문제가 없습니다.
캐싱을 사용하여 계속 가져올 필요가없는 정보를 저장했습니다.

이제 반응 형 인터페이스를 만들고 싶습니다. 목표는 사용자에게 필터링 된 주문 헤더를 표시하고 백그라운드에서 주문 라인을로드하는 것입니다.

일부 계산의 전체 원인으로 모든 선 (주문 선)을 관리해야하므로 원인을 원합니다.

jQuery를 사용하여 주문 헤더를 가져와 캐시 (System.Web.Caching.Cache)에 저장하는 액션에 Ajax 호출을 사용하고 있습니다.
Ajax 호출이 성공하면 다른 Ajax 호출을 실행하여 줄을 가져오고 다시 캐시에 결과를 저장합니다.

아주 잘 작동합니다.

이제이 논리 중 일부를 클라이언트에서 서버로 옮길 수 있는지 알아 내려고했습니다.

내 작업이 호출되면 주문 헤더를 가져오고 주문 ​​행 가져 오기를 담당하는 새 스레드를 시작하여 결과를 클라이언트에 반환하려고합니다. 테스트 응용 프로그램에서

나는 모두 ThreadPool.QueueUserWorkItemTask.Factory을 시도하지만 생성 된 스레드 내 캐시에 액세스하려는.

내가 같이 함께 테스트 응용 프로그램을 넣어 짓을했습니다

TEST 1

[HttpPost] 
public JsonResult RunTasks01() 
{ 
    var myCache = System.Web.HttpContext.Current.Cache; 
    myCache.Remove("KEY1"); 

    ThreadPool.QueueUserWorkItem(o => MyFunc(1, 5000000, myCache)); 

    return (Json(true, JsonRequestBehavior.DenyGet)); 
} 

TEST 2

[HttpPost] 
public JsonResult RunTasks02() 
{ 
    var myCache = System.Web.HttpContext.Current.Cache; 
    myCache.Remove("KEY1"); 

    Task.Factory.StartNew(() => 
    { 
     MyFunc(1, 5000000, myCache); 
    }); 

    return (Json(true, JsonRequestBehavior.DenyGet)); 
} 

Func라고은 목록 상자 항목을 저장하고 결과를 캐시에 저장합니다. 꽤 바보 같지만 그것은 단지 시험입니다.

나는 누군가가 더 나은 해결책을 가지고 있는지 또는 별도의 스레드에서 캐시에 액세스 할 수있는 몇 가지 함축을 알고 있는지 알고 싶습니다.

내가 알아야 할 것이 있습니까?이를 피하거나 개선 할 수 있습니까?

도움 주셔서 감사합니다.

답변

1

내가 접근 할 수있는 한 가지 가능한 문제점은 System.Web.HttpContext.Current이 별도의 스레드에서 사용 가능하지 않을 수 있다는 것입니다. 요청이 완료되면이 스레드가 나중에 실행될 수 있습니다. 이전 HttpContext.Cache 대신 .NET 4.0에 도입 된 System.Runtime.Caching 네임 스페이스의 클래스를 사용하는 것이 좋습니다.

+0

감사합니다. 캐시에 문제가있을 수 있다고 생각했습니다. 나는 시스템에 대해 몰랐어. 런 타임. 캐싱. 나는 그것을 볼 것이다. – LeftyX

관련 문제