2010-10-28 74 views
4

我试图在Silverlight for Windows Phone中使用异步HttpWebRequest等待HttpWebRequest.BeginGetResponse在Windows Phone 7中完成

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();它只是挂起...

为什么任何建议:直到我到了那里我应该叫

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

GetResponseCallback所有作品完美?

+0

什么的线程是这? – 2010-10-28 18:37:38

+0

这是在主线程 – greve 2010-10-28 18:52:14

回答

3

这只是需要一点思考从WP7平台上的异步条件阻塞/等待思考。结果是用户总是能够与UI进行交互。

移动到你的完成代码的调用(在这种情况下的WriteLine)到您的CompletedEventHandler和任何UI更新马歇尔回到UI线程与

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

如果有不应该交互的任何UI元素在异步操作正在执行的同时,这些控件可以在过渡期间隐藏或禁用。

+0

我只需在GetResponseCallback中添加Dispatcher.BeginInvoke(...)并完美工作。例如:if(resultOK){Dispatcher.BeginInvoke((()=> {/ * UI更新代码* /}); – Hugo 2013-03-14 16:18:31

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(); 
+0

嗯......这似乎没有帮助。它实际上挂在'response =(HttpWebResponse)request.EndGetResponse(asynchronousResult);' – greve 2010-10-28 20:39:14

2

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

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