IAsyncResult未完成并锁定UI



我正在进行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中应该重新启用的部分。

最新更新