2010-03-27 2 views

답변

6

이것은 스레딩 문제가 아니지만 웹 브라우저 UI 문제입니다. 서버에서 작업 할 때 브라우저가 상태를 렌더링하게합니다. 이론적으로 당신은 같은 것을 할 수있는 :

Response.Write("something"); 
Response.Flush(); 

을하지만 Flush()는 브라우저가 실제로 그 순간에 코드를 렌더링 보장하지 않습니다. 실제로 서버에서 브라우저로 데이터가 캐싱/청크/버퍼링되는 방식을 제어 할 수 없습니다. 따라서 각 업데이트는 '전체'http 트랜잭션이어야합니다.

편도, 그리고 일반적인 하나, 이것을 달성하기 위해 AJAX를 사용하는 것입니다. 사용자가 배경 작업을 시작하는 버튼을 클릭하고 작업 상태를 폴링 (요청)하여 클라이언트 브라우저를 업데이트하는 자바 스크립트 타이머가 있습니다.

ajax 및 .net을 사용하여 Ajax 진행 표시기를 수행하는 경우 Real-Time Progress Bar With ASP.NET AJAX을 확인하십시오.

이 문서에서 HTTP 처리기와 진행 표시 줄 만들기의 훌륭한 예를있다 : IE 나 크롬에서 다음 코드는 파이어 폭스에서 '내 지점을 증명하지만,하지 않으려면 http://www.asp101.com/articles/matt/progressbar/default.asp

을 :

protected void Page_Load(object sender, EventArgs e) 
{ 
    Response.Buffer = false; 
    Response.Clear(); 
    Response.Write("<html><body>"); 
    Response.Write("1\n"); 
    Response.Flush(); 
    Thread.Sleep(2000); 
    Response.Write("1\n"); 
    Response.Flush(); 
    Thread.Sleep(2000); 
    Response.Write("1\n"); 
    Response.Flush(); 
    Thread.Sleep(2000); 
    Response.Write("1\n"); 
    Response.Flush(); 
    Response.Write("</body></html>"); 
    Response.End(); 
} 
+0

전에 쓰레드를 사용하는 정말 깔끔한 방법을 보았습니다 ... 어디서 어떻게 쓰는지 기억하지 못합니다. 그것은 기본적으로 실행중인 메소드를 시작하고, 다음 빈도 때마다 진행 메시지가 표시됩니다. – Danny

+0

진행 상태를 업데이트하는 스레드에서 작업이 실행됩니다. 그런 다음 고객이 주를 투표합니다. 앞서 언급했듯이 이론적으로 스레드에서 작업을 끝내고 Response.Write 및 Response.Flush를 사용하여 진행 상황을 기록 할 수 있지만 전체 요청이 완료되기 전에 실제로 브라우저로 플러시되고 렌더링됩니다. –

+0

Response.Write가 스레드에서 작동하지 않는다고 생각합니다. 그러나 이전에 보았던 항목에서 뭔가가 돌아오고 있으며 AJAX를 사용하여 상태 클라이언트 측을 풀링 한 것으로 보입니다. – Danny

관련 문제