2011-09-21 7 views
1

C# 코드가 있는데 webRequest.begingetresponse에 문제가 있습니다.WebRequest.BeginGetResponse가 비동기 적으로 작동하지 않습니다.

비동기 호출 에 대해 사용하려고하면 작업 스레드가 차단되고 콜백 호출이 대기됩니다. 그러나 설명서를 읽으면서 현재 스레드가 계속 실행되어야하고 응답이 서버에서 돌아 오면 다른 스레드가 콜백 메소드를 호출해야합니다.

[UPDATE] 실제로 서버에서 응답을받는 것은 현재 스레드가 차단 된 곳이며 스레드 ID를 확인할 때 콜백을 호출하는 스레드는 요청을 보낸 스레드와 같습니다.

제가 누락 된 것일 수도 있습니다.

public class MyRequestState 
{ 

    public WebRequest Request; 
    public WebResponse Response; 
    public ManualResetEvent allDone = new ManualResetEvent(false); 

    public MyRequestState() 
    { 

     Request = null; 
     Response = null; 
    } 
} 


public class SendRequest 
{ 
    private void ResponseCallback(IAsyncResult result) 
    { 
    //do sth ... 
    state.Response = (HttpWebResponse)request.EndGetResponse(result); 
    //do sth ... 
    state.allDone.Set(); 
    } 
    public void MakeWebRequestAsync(string url) 
    { 
    HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url); 
    request.Method = "GET"; 
    request.Proxy = null; 
    state state = new MyRequestState(); 
    state.Request = request; 

    IAsyncResult result = request.BeginGetResponse(new System.AsyncCallback(ResponseCallback), state); 

    state.allDone.WaitOne(); 
    } 

}

+4

코드를 표시하십시오. – Michael

+0

실버 라이트인가요? 호출이 비동기이기는하지만 begin과 end getResponse는 모두 같은 스레드에서 수행되기 때문에 Silverlight에서 정확한 문제가 발생했습니다. 따라서 여러분은 무기한 차단됩니다. 그것은 질문을 구걸합니까, 왜 비동기 호출을 동기로 만들려고합니까? – Matt

+0

배경을 더 제공 할 수 있습니까? 이 코드는 어떤 종류의 응용 프로그램에서 실행됩니까? 콘솔 앱, 실버 라이트, 서비스 프로세스 등입니까? 또한 어떤 버전의 프레임 워크입니까? 당신이 치고있는 URL은 무엇입니까? – feroze

답변

0

WebRequest.BeginGetResponse 동 기적으로 연결 기다렸다가 비동기 적으로 데이터를 수신 :

다음은 코드의 조각입니다. 연결에 몇 시간이 걸리면 잠시 동안 호출 스레드가 고정됩니다.

+0

실제로 서버에서 응답을 되 찾는 것은 현재 스레드가 차단 된 곳이며, 스레드 ID를 확인할 때 콜백을 호출하는 스레드는 요청을 보낸 스레드와 같습니다. – iampat

+0

자세한 내용을 알 수있는 정보 (또는 소스에 대한 링크)를 게시 할 수 있습니까? BeginGetResponse가 연결을 기다려야한다면 그 목적은 무엇입니까? 연결을 기다리는 것이 어떻게 비동기 적으로 처리 될 수 있습니까? – Suma

0

요청을 시작한 직후 ManualResetEvent에서 기다리고 있습니다. 그래서 스레드가 차단됩니다. 완료 콜백이 호출 될 때까지 스레드가 계속 신호를 보내지 않습니다.

+0

코드를 추적 할 때 스택 호출은 beginGetResponse에서 차단되었다는 것을 보여 주며 state.allDone.WaitOne(); 잠시 후 콜백을 치고 state.allDone.WaitOne()을 호출합니다. 또한 결과의 CompletedSynchronously 속성을 확인했는데 항상 true입니다. 스레드 ID는 어떻게됩니까? 같은 스레드가 요청과 콜백을 호출합니다. – iampat

관련 문제