2010-07-25 4 views
2

코드 :스레드 - ResetEvent 및 웹 클라이언트

public string GetTextWebRequest(string url) 
    { 
     WebClient cl = new WebClient(); 
     cl.DownloadStringCompleted += new DownloadStringCompletedEventHandler(cl_DownloadStringCompleted); 
     cl.DownloadStringAsync(new Uri(url)); 
     are.WaitOne(); 
     return _textdata; 
    } 

    void cl_DownloadStringCompleted(object sender, DownloadStringCompletedEventArgs e) 
    { 
     _textdata = e.Result; 
     are.Set(); 
    } 

왜 내가 'DownloadString'방법을 사용하지 않는 건가요? 컴팩트 프레임 워크를 사용하고 있기 때문에 비동기가 유일한 옵션입니다.

메인 (호출) 스레드가 차단되면 어쨌든 내 문제는 'DownloadStringCompleted'가 호출되지 않습니다. 따라서 절대로 차단 해제되지 않습니다.

내 생각에 WebClient가 호출 스레드에서 'DownloadStringCompleted'를 호출한다는 것은 의미가 없습니다.

조금 길어졌습니다.

답변

1

내 유일한 생각은 웹 클라이언트가 호출이 에 이해가되지 않습니다 호출 스레드를, 'DownloadStringCompleted'이다?

그러나 정확히 무슨 일이 일어나고 있는지. 잘못 문서화되었지만이 메소드 + 이벤트는 백그라운드 워커 모델을 따릅니다. DownloadStringCompletedEventArgs 멤버에서 관계를 볼 수 있습니다.

Bgw 패턴은 WinForms (관련) 라이브러리의 여러 위치에서 사용됩니다. 예를 들어 PictureBox 컨트롤을 참조하십시오.

결론 : 차단하지 마세요 ... 이벤트 중심 접근 방식을 설계해야합니다.

+0

아, 나는 그렇게 생각했습니다. 확인을위한 감사합니다. – Peanut