2011-11-04 2 views
0

서버에서 웹 페이지의 일부 텍스트를 표현하고 싶습니다. 왜 서버에 label.Text가 설정되었지만 웹 페이지에서 변경되지 않는 이유는 무엇입니까?

나는
<asp:Label id="label1" runat="server" /> 

을 정의

protected void Button1_Click(object sender, EventArgs e) 
    { 
     label1.Text = "bla"; 
     timer = new System.Threading.Timer(new TimerCallback(DoSomething), null, 0, 10000);   
    } 

    private void DoSomething(object obj) 
    { 
     label1.Text = "bla 1"; 
    } 
즐이 제시

하지만 bla1하지를 설정합니다. 디버깅 할 때 "bla 1"행이 실행되는 것을 볼 수 있습니다. 어디서 잘못 했습니까?

답변

3

DoSomething()이 실행될 때까지 브라우저에 응답이 이미 보내 졌으므로 코드에는 아무런 영향이 없습니다. 사실, 나는 당신이 그것으로 애플 리케이션 도메인을 크래프하지 않는 것이 놀랍다.

asp.net 응용 프로그램에서 이와 같은 스레딩 프리미티브를 사용하지 마십시오.

초기 페이지 표시보다 나중에 '나중에'값을 업데이트하려면 Ajax를 살펴야합니다.

+0

그래서 어떻게 해결할 수 있습니까? Thread.CurrentThread.Join(); –

+0

Ummm ... 아니요. 클라이언트 측에서 Ajax 요청을 추가로 "해결"합니다. * asp.net 응용 프로그램에서 스레딩을 시도하지 마십시오. * Puppies and kittens will cry. –

0

페이지 응답을 보내기 전에 새 타이머가 완료되지 않았다고 생각합니다. 스레드가 아마도 오류를 던지고 그냥 종료됩니다.

0

다른 스레드에서 레이블을 비동기 적으로 변경할 수 없습니다. 일단 응답이 브라우저로 보내지면 서버에서 아무 작업도 수행하지 않습니다. 자바 스크립트를 사용하여 클라이언트 측 ujpdate를 수행해야합니다.

0

ASP.Net은 서버에서 코드를 실행하고 결과를 다시 브라우저에 전달합니다. 일단 완료되면 서버에서 일어나는 일은 브라우저의 HTML에 아무런 영향을 미치지 않습니다.

0

이유는 버튼을 클릭하면 요청/응답 프로세스가 발생하기 때문입니다. 스레드가 페이지 또는 그 부분을 어떤 방식 으로든 새로 고치지 않습니다.

아마도 당신은 웹 소켓이나 ajax long pooling으로 혜성과 함께 필요한 결과를 얻을 수 있습니다.

관련 문제