2011-10-09 1 views
0

좋아, 멀티 스레딩과 관련하여 StackOverflow에 대한 다른 게시물을 많이 읽었지만 특정 질문에 대한 답변이 하나도 표시되지 않습니다.AJAX 콘솔에 피드를 처리하는 C# 프로세스 모니터링 스레드

XML 문서에서 데이터베이스로 약 5000 레코드를 처리하는 MVC 3 응용 프로그램이 있습니다. 나는보기가 트랜잭션의 진행 상황을 모니터하는 AJAX 콘솔을 포함하고 싶어한다. (얼마나 많은 이벤트를 성공적으로 작성했는지, 얼마나 많은 이벤트가 실패했는지, 잠재적 인 중복 플래그 등) 진행 과정에서 세션 수준 변수를 채우는 프로세스를 하나의 컨트롤러 인스턴스에서 실행하고 AJAX 콘솔에서 세션 변수 값을 얻기 위해 1 초 간격으로 호출 한 인스턴스를 가질 수 있습니까?

더 좋은 방법이 있습니까? 멀티 스레딩은 많은 사람들이 언급하는 것을 볼 수 있지만 직접 적용 할 수있는 솔루션은 없습니다. 제안?

+0

어쩌면 정적'class.variable'이 길일 것입니다. –

답변

1

귀하의 제안은 실행 가능하지만 약간의 생각이 필요합니다. 여러 AJAX 요청이 들어오는 경우 IIS는 다중 스레드에서 이러한 요청을 처리하므로 멀티 스레딩이 가능합니다. 즉, 스레드로부터 안전한 세션 상태에 액세스해야합니다. 또한 진행 요청이 처리되는대로 처리 스레드 완료와 동시에 세션 개체를 제거하는 경우를 처리해야합니다

// put an instance of this class in the user's Session 
class Progress 
{ 
    public object Locker { get; private set; } 

    public Progress() 
    { 
     Locker = new Object(); 
    } 

    public int SuccessCount { get; set; } 
    public int FailureCount { get; set; } 
    public int DuplicateCount { get; set; } 
} 

// update the counts in the processing logic inside a lock 
Progress progress = Session[ ... ]; 
lock(progress.Locker) 
{ 
    progress.SuccessCount = ... 
    progress.FailureCount = ... 
    progress.DuplicateCount = ... 
} 

// read the counts in the progress handler also inside a lock on the same object 
Progress progress = Session[ ... ]; 
lock(progress.Locker) 
{ 
    retval.SuccessCount = progress.SuccessCount; 
    retval.FailureCount = progress.FailureCount; 
    retval.DuplicateCount = progress.DuplicateCount; 
} 
return retval; 

: 그래서 당신이 뭔가를 필요로 할 것이다. 또한 한 세션에서 여러 개의 처리 스레드 (따라서 Progress 개 개체)를 처리해야 할 수도 있습니다.

생각해보아야 할 것이 조금 있지만, 할 수 있습니다.

+0

Static 클래스를 사용하는 것이 더 좋을 것이라고 생각하십니까? 나는 그것을 토요일 밤에 시험해 보았다. 그리고 그것은 꽤 잘 작동하는 것처럼 보였다. 그러나 나는 예외적 인 노출을 확신하지 않고있다. 당신의 접근 방법을 연구하고 테스트 할 것입니다. 고맙습니다. –

관련 문제