2013-01-12 3 views
1

웹 양식 응용 프로그램이 있습니다. 한가지 형태로 나는 몇 가지 기능을 가지고있다. 어떤 것은 동기로 호출되며 시간이 좀 걸립니다. 그래서 다른 스레드에서 호출해야합니다. asp.net에서 스레드를 사용하는 방법?

내가 뭘하는지의 샘플입니다 :
protected void Page_Load(object sender, EventArgs e) 
    { 
     Thread t1 = new Thread(new ThreadStart(Function1)); 
     t1.Start(); 
     Thread t2 = new Thread(new ThreadStart(Function2)); 
     t2.Start(); 
    } 

    private void Function1() 
    { 
     Thread.Sleep(5000); 
     lbl1.Text = "Function1 completed"; 
    } 

    private void Function2() 
    { 
     Thread.Sleep(5000); 
     lbl2.Text = "Function2 completed"; 
    } 

내가 lbl1.Text = "Function1 completed";lbl2.Text = "Function2 completed"; 호출지고 (설정 breackpoints), 디버깅하지만 텍스트는 최종 HTML 페이지에이 변경되지 않은 경우

.

또한 페이지로드에는 5 초가 걸리지 않습니다.

p.s. asp net works는 다르지만 내가 뭘 잘못하고 있는지 전혀 모른다.

+1

나는 대신 작업과 비동기/대기 키워드를 사용할 것을 강력히 권합니다. – Rick

답변

7

페이지 렌더링이 완료되기 전에 스레드가 완료 될 때까지 기다리는 것이 없습니다. 이것이 잘못된 것입니다. 당신의 Page_Load() 함수의 목적을 위해

(또는 페이지 렌더링 라이프 사이클의 최신-가능한 시점에서) 추가 : 추가

t1.Join(); 
t2.Join(); 

: 당신이 스레드 시저 내에서 LBL1 및 LBL2를 업데이트해야합니다 - 당신은 결과를 변수에 저장하고 계산 된 값을 주 렌더링 스레드에 반영해야합니다 (즉, Join이 반환 된 경우).

편집 : 문제가 수정되었지만 Vano의 답변에서 권장하는대로 PageAsyncTask을 확인하십시오. 비동기 기능을 실행하려면

+0

Thansk 작동합니다. – user1972654

+0

이것이 코드 작동을 가져 오지만, Vano의 대답에 따라 PageAsyncTask를 살펴 보는 것이 좋습니다. –

2

, 당신은 몇 가지 단계를 수행해야합니다

1). Async = "true"페이지 지시문을 설정해야합니다.

<%@ Page Language="C#" Async="true" ... %> 

2). PageAsyncTask 개체를 만들고 Page.RegisterAsyncTask() 함수를 사용하여 개체를 등록해야합니다.

RegisterAsyncTask 함수는 syncronization context에 함수를 등록하므로 ASP.NET은 함수를 비동기 적으로 실행하고 등록 된 모든 함수가 완료 될 때까지 대기 한 다음 페이지 처리를 계속 수행합니다.

0

새 스레드를 시작하지만 완료 될 때까지 기다리지 마십시오. 따라서 thread.start()가 비 차단이기 때문에 page_load가 완료까지 실행됩니다.

최신 .NET 버전에서 async/wait를 확인하십시오. 그것은 훨씬 쉽고 예측할 수있게 해줍니다.

+0

예를 들어 주시겠습니까? – user1972654

관련 문제