等待HttpWebRequest.BeginGetResponse在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(); 它只是挂起……

有什么建议吗?

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

将调用您的完成代码(在本例中为writeline)移动到CompletedEventHandler中,并且对于任何UI更新,将调用回到UI线程

 Dispatcher.BeginInvoke( () => { /* your UI update code */ } ) 

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

说实话,这不是一个好主意。 等待主(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 

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

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

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

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

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