等待HttpWebRequest.BeginGetResponse在Windows Phone 7中完成

时间:2010-10-28 18:31:52

标签: c# silverlight httpwebrequest windows-phone-7

我正在尝试在Silverlight for Windows Phone中使用异步HttpWebRequest。一切都很完美,直到我到达我应该打电话的地方

private static ManualResetEvent allDone = new ManualResetEvent(false);
...
request.BeginGetResponse(new AsyncCallback(GetResponseCallback), request);
allDone.WaitOne();
Debug.WriteLine("All done!");

GetResponseCallback

private void GetResponseCallback(IAsyncResult asynchronousResult)
{
    try
    {
        request = (HttpWebRequest)asynchronousResult.AsyncState;
        response = (HttpWebResponse)request.EndGetResponse(asynchronousResult);
        allDone.Set();
    }
    catch (Exception e)
    {
        Debug.WriteLine("Got Exception in GetResponseCallback: " + e.Message);
    }
}

致电allDone.WaitOne();后,它就会挂起......

有关原因的任何建议吗?

6 个答案:

答案 0 :(得分:3)

这只是在阻止/等待在WP7平台上以异步术语思考的过程中稍微改变一下。结果是用户始终能够与UI进行交互。

将调用您的完成代码(在本例中为writeline)移动到CompletedEventHandler中,并且任何UI更新都会使用

返回到UI线程
Dispatcher.BeginInvoke( () => { /* your UI update code */ } )

如果在执行异步操作时有任何不应与之交互的UI元素,则可以隐藏或禁用这些控件。

答案 1 :(得分:2)

老实说,这不是一个好主意。等待主(UI)线程将锁定手机并创建无响应的UI。从长远来看,不打击WP7和Silverlight中的异步网络访问会更好,代码可能会更复杂,并且最终会有很多方法需要回调,但拥有更多响应UI是比锁定更好。

var request = WebRequest.CreateHttp(uri);

request.BeginGetResponse(r =>
{
    var reponse = request.EndGetResponse(r);

    // Do things response here
}, null);

// Let the method end and not wait

答案 2 :(得分:1)

我遇到了同样的问题但是当我用新的替换WP7图像时解决了。未锁定的图像将导致此问题。

答案 3 :(得分:1)

这似乎是模拟器的限制。我还没有尝试过,但我相信在解锁的wp7模拟器上运行它应该可以解决问题。 http://forum.xda-developers.com/showthread.php?p=11148176#post11148176

答案 4 :(得分:1)

另请注意,如果从未发生ManualResetEvent,则此WaitOne调用将永远不会返回: http://msdn.microsoft.com/en-us/library/bb299385.aspx

答案 5 :(得分:0)

您可能希望将allDone.Set()移到try..catch之外。否则,如果存在异常并且启动异步操作的线程将挂起,则永远不会设置该事件。也就是说,你想写:

try
{
    request = (HttpWebRequest)asynchronousResult.AsyncState;
    response = (HttpWebResponse)request.EndGetResponse(asynchronousResult);
}
catch (Exception e)
{
    Debug.WriteLine("Got Exception in GetResponseCallback: " + e.Message);
}

allDone.Set();