2011-04-05 2 views
3

WP7 HttpWebRequest는 시간 제한을 지원하지 않으므로 타이머를 사용하여 기능을 구현하고 있습니다. 아래는 그 예입니다. UI 양식에서 GetConnection()을 호출합니다. 그러나 ReadCallback()은 타이머 시간이 끝날 때까지 실행되지 않습니다. 타이머가 중지되면 ReadCallBack()이 트리거됩니다. 타이머 스레드가 HTTP 응답을 차단하고있는 것 같습니다. 어떤 도움을 주셔서 감사합니다. ManualResetEvent도 시도해 봤는데 같은 결과가 있습니다.WP7의 HttpWebRequest Timeout이 타이머와 함께 작동하지 않습니다.

private HttpWebRequest conn; 
private bool _timedOut = false; 
private DispatcherTimer tmr; 

public void GetConnection() 
{ 
    conn = (HttpWebRequest)HttpWebRequest.Create(new Uri("http://www.contoso.com")); 
    conn.Method = "GET"; 

    tmr = new DispatcherTimer(); 
    tmr.Interval = TimeSpan.FromSeconds(10); 
    tmr.Tick += new EventHandler(tmr_Tick); 
    _stopTimer = false; 

    IAsyncResult resp = conn.BeginGetResponse(new AsyncCallback(ReadCallback), conn); 

    tmr.Start(); 
} 

private void tmr_Tick(object sender, EventArgs e) 
{ 
    if (!_stopTimer) 
    { 
     tmr.Stop(); 
     conn.Abort(); 
    } 
} 

private void ReadCallback(IAsyncResult asynchronousResult) 
{ 
    _stopTimer = true; 
    HttpWebRequest request = (HttpWebRequest)asynchronousResult.AsyncState; 

    m_response = (HttpWebResponse)request.EndGetResponse(asynchronousResult); 
} 

답변

3

코드가 예상대로 작동합니다. 보류중인 요청에 대해 Abort()를 호출하면 ReadCallback이 발생합니다. EndGetResponse()를 호출하면 Status = RequestCanceled 인 WebException이 발생합니다.

동작에서 볼이 약간 수정 된 코드를 사용해보십시오 :

private void ReadCallback(IAsyncResult asynchronousResult) 
{ 
    _stopTimer = true; 
    HttpWebRequest request = (HttpWebRequest)asynchronousResult.AsyncState; 

    try 
    { 
     var m_response = (HttpWebResponse)request.EndGetResponse(asynchronousResult); 
     System.Diagnostics.Debug.WriteLine("Success"); 
    } 
    catch (WebException exc) 
    { 
     System.Diagnostics.Debug.WriteLine(exc.Status); 
    } 
} 

은 MSDN에 참조 : http://msdn.microsoft.com/en-us/library/system.net.httpwebrequest.abort(v=VS.95).aspx

는 "강제 종료 방법은 자원에 대한 요청을 취소 요청이 취소 된 후. BeginGetResponse, EndGetResponse, BeginGetRequestStream 또는 EndGetRequestStream 메서드를 호출하면 Status 속성이 RequestCanceled로 설정된 WebException이 발생합니다. "

+0

T 행크스, 지금 일합니다. – user693080

관련 문제