我正在尝试在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();
后,它就会挂起......
有关原因的任何建议吗?
答案 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();