Windows phone 7 WP7中的HttpWebRequest超时不使用计时器

Windows phone 7 WP7中的HttpWebRequest超时不使用计时器,windows-phone-7,httpwebrequest,timeout,Windows Phone 7,Httpwebrequest,Timeout,由于WP7 HttpWebRequest不支持超时,因此我使用计时器来实现该功能。下面是一个例子。我从UI表单调用GetConnection()。但是,在计时器时间结束之前,永远不会执行ReadCallback()。计时器停止后,将触发ReadCallBack()。似乎计时器线程正在阻止HTTP响应。感谢您的帮助。我也尝试过ManualResetEvent,结果也一样 private HttpWebRequest conn; private bool _timedOut = false; pri

由于WP7 HttpWebRequest不支持超时,因此我使用计时器来实现该功能。下面是一个例子。我从UI表单调用GetConnection()。但是,在计时器时间结束之前,永远不会执行ReadCallback()。计时器停止后,将触发ReadCallBack()。似乎计时器线程正在阻止HTTP响应。感谢您的帮助。我也尝试过ManualResetEvent,结果也一样

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);
}

你的代码对我来说工作正常。当您对挂起的请求调用Abort()时,您的ReadCallback将被触发。然后,当调用EndGetResponse()时,应该会得到一个状态为requestCancelled的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:

Abort方法取消对资源的请求。取消请求后,调用BeginGetResponse、EndGetResponse、BeginGetRequestStream或EndGetRequestStream方法会导致状态属性设置为RequestCancelled的WebException