我正在进行REST调用,服务器端响应采用XML的形式。我异步拨打这个电话。我将它作为控制台应用程序进行测试,它可以正常工作。但是,当我在 XBOX 上测试时,异步请求永远不会完成。我的processVideo方法解析XML并将项放入List中。我需要从另一个类引用此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
}
答案 0 :(得分:1)
while循环是你的问题。您不应该等待这样的异步调用完成。您应该在发送到Begin方法的异步回调中执行您想要执行的任何操作。原因是UI设置了用于异步回调的同步上下文。这种方式的工作方式是将回调编组到UI线程上,以便维护UI上下文。因为你的while循环阻塞了你的UI线程,所以回调永远不会发生,导致异步调用没有完成。
希望这有帮助。
答案 1 :(得分:0)
getVideoList
。如果您需要UI在此操作完成之前不允许某些操作,则必须在调用BeginGetResponse
之前禁用它们。删除在主UI线程上等待IsCompleted
的任何循环(这将阻止 UI并使其看起来“挂起”)。在getVideoList
中,重新启用在BeginGetResponse
调用完成后应重新启用的UI部分。