2012-10-26 2 views
2

응용 프로그램이 System.Diagnostics 클래스를 사용하여 시스템에서 명령을 실행하는 웹 응용 프로그램을 작성하고 있습니다. 완료하려면 많은 시간이 소요되는 명령에서 실시간 출력을 표시하려고합니다. 조금 검색 한 후, BeginOutputReadLine이 이벤트 처리기로 출력을 스트림 할 수 있음을 발견했습니다.asp.net에서 명령 줄 프로그램의 실시간 출력 표시

또한 jquery ajax를 사용하여이 메서드를 호출하고 프로세스를 비동기 적으로 실행합니다. 나는 페이지에 레이블과 명령의 출력을 저장하는 정적 변수로 클래스를 선언 한

Process p2= new Process(); p2.OutputDataReceived += new DataReceivedEventHandler(opHandler); p2= Process.Start (psi2);
p2.BeginOutputReadLine();

늘 정적에서 액세스 할 수 : 지금까지, 나는이 방법을 위해 노력하고 있어요 방법.

public class ProcessOutput 
{ 
    public static string strOutput; 

    [WebMethod] 
    public static string getOutput() 
    { 
     return strOutput; 
    } 
} 

BeginOutputReadLine의 이벤트 처리기에서 output의 줄을 사용하여 변수를 설정하십시오.

private static void opHandler(object sendingProcess,DataReceivedEventArgs outLine) 
    { 
     if (!String.IsNullOrEmpty(outLine.Data)) 
     { 
      ProcessOutput.strOutput= outLine.Data; 
     } 
    } 

및 영문 페이지에서

가 나는 이유를 잘 모릅니다 strOutput

의 값
$(document).ready(function() { 

setInterval(function() { 
    $.ajax({ 
    type: "GET", 
    url: "newscan.aspx/getOutput", 
    data: "", 
    success: function(msg){ 
    $('#txtAsyncOp').append(msg.d); 
    } 
}); 
}, 1000); 

});  

을 얻을 수있는 방법을 호출하고 있지만, lable가 업데이트 점점되지 않습니다. 경고를하면 10 초마다 알림 상자에 '정의되지 않음'이 표시됩니다. 아무에게 나 올바르게 제안하는 방법을 제안 할 수 있습니까?

+0

문제를 해결할 수 있었습니까? 제발 알려주세요. 그렇다면 친절하게 대답을 표시하십시오 - 감사합니다! :) – webbexpert

답변

0

각 요청은 요청 파이프 라인의 일부로 새 스레드를 시작합니다. 이는 의도적으로 설계된 동작입니다. 각 스레드는 고유 한 스택을 가지며 서로 다른 스택에 액세스 할 수 없습니다. 스레드가 새로운 메소드를 실행하기 시작할 때, 그 메소드에 인수와 로컬 변수를 자체 스택에 저장합니다. 긴 이야기를 짧게 말하면 변수를 할당 할 수 없으며 다른 요청에서 값을 가져올 것으로 예상됩니다.

System.Web.HttpContext.Current.Session["variable"] = value ; 

또는 당신이 사용하는 응용 프로그램 범위로 설정 :

당신이 세션 변수 (가장 일반적인)로 범위를 할 수있는, 부부가 취할 수있는 접근이있다

if (System.Web.Caching.Cache["Key1"] == null) 
     System.Web.Caching.Cache.Add("Key1", "Value 1", null, DateTime.Now.AddSeconds(60), Cache.NoSlidingExpiration, CacheItemPriority.High, onRemove); 

또는 출력을 데이터베이스 또는 파일에 기록하고 WebMethod를 통해 결과를 출력 할 수 있습니다. 장기 실행 프로세스가 비동기 적으로 실행되는 경우 HttpContext에 액세스 할 수 없기 때문에 세션 상태 백을 사용할 수 없습니다. 응용 프로그램 캐시를 사용할 수 있지만 일반적으로 이러한 유형의 메커니즘에는 사용되지 않습니다 (캐시는 지속성 메커니즘이 아닌 성능상의 이유로 사용 가능합니다 - 웹 응용 프로그램이 재생할 때 제어 할 수 없음을 기억하는 것이 중요합니다).

데이터베이스 또는 로그 파일에 쓰기를 강력하게 제안합니다. 비동기 프로세스는 일반적으로 잠재적 문제를 진단하고 결과를 확인하기 위해 기록 된 출력 또는 추적을 필요로합니다.

또한 웹 앱이 언제 재생되는지 제어 할 수 없기 때문에 실행중인 하위 프로세스를 쉽게 제어 할 수 없습니다. 더 나은 디자인은 asynchronous method in-process 또는 데이터베이스를 폴링하여 작업을 선택하는 독립 프로세스 응용 프로그램 또는 서비스 (플랫폼에 따라 작업 스케줄러 또는 cron 사용 가능)를 시작합니다.

관련 문제