我正在进行REST调用,服务器端的响应是XML形式的。我正在异步进行此调用。我已经将它作为控制台应用程序进行了测试,它可以正常工作。然而,当我在XBOX上测试它时,异步请求永远不会完成。我的processVideo方法解析XML并将项目放入列表中。我需要从另一个类引用这个List,所以我添加了(result.IsCompleted==false),以确保在引用和使用List之前完成异步调用。异步请求似乎从未完成并锁定了UI,有什么想法吗?
public void initilaizeRest()
{
WebRequest request = HttpWebRequest.Create(URI);
request.Method = GET;
// RequestState is a custom class to pass info to the callback
RequestState state = new RequestState(request, URI);
IAsyncResult result = request.BeginGetResponse(new AsyncCallback(getVideoList), state);
Logger.Log("Querystate :"+QUERYSTATE+" URI:"+URI);
/// Wait for aynchronous response to be completed
while (result.IsCompleted == false)
{
Logger.Log("Sleeping");
Thread.Sleep(100);
}
}
public void getVideoList(IAsyncResult result)
{
RequestState state = (RequestState)result.AsyncState;
WebRequest request = (WebRequest)state.Request;
HttpWebResponse response = (HttpWebResponse)request.EndGetResponse(result);
//Process response
switch (QUERYSTATE)
{
case (int)Querystate.SERIESQUERY:
Logger.Log("Processing series state");
processSeries(response);
break;
case (int)Querystate.VIDEOQUERY:
Logger.Log("Processing video state");
processVideo(response);
break;
}
}
public void processVideo(HttpWebResponse response)
{
//parses XML into an object and places items in a LIST
}
while循环是您的问题。您不应该像这样等待异步调用完成。您应该在发送给Begin方法的异步回调中执行想要执行的操作。原因是UI设置了一个用于异步回调的同步上下文。其工作方式是将回调整理到UI线程上,以便维护UI上下文。因为while循环阻塞了UI线程,所以回调永远不会发生,导致异步调用无法完成。
希望这能有所帮助。
getVideoList
。如果您需要UI在该操作完成之前不允许某些操作,则必须在调用BeginGetResponse
之前禁用这些操作。删除主UI线程上等待IsCompleted
的任何循环(这将阻塞UI并使其看起来"挂起")。在getVideoList
中,当对BeginGetResponse
的调用完成时,重新启用UI中应该重新启用的部分。