2

我正在进行 REST 调用,服务器端响应采用 XML 的形式。我正在异步进行此调用。我已经将它作为控制台应用程序进行了测试,它可以正常工作。但是,当我在XBOX上测试它时,异步请求永远不会完成。我的 processVideo 方法解析 XML 并将项目放入列表中。我需要从另一个类中引用这个列表,所以我添加了(result.IsCompleted == false) 以确保在我引用和使用列表之前完成异步调用。似乎异步请求永远不会完成并锁定 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
}
4

2 回答 2

1

while 循环是你的问题。您不应该像这样等待异步调用完成。您应该在发送到 Begin 方法的异步回调中做任何您想做的事情。原因是 UI 设置了用于异步回调的同步上下文。其工作方式是将回调编组到 UI 线程上,以便维护 UI 上下文。因为您的 while 循环阻塞了您的 UI 线程,所以不会发生回调,导致异步调用未完成。

希望这可以帮助。

于 2012-08-07T18:54:36.177 回答
0

getVideoList将在异步操作完成时调用。如果您需要您的 UI 在此操作完成之前不允许某些操作,您必须在调用BeginGetResponse. IsCompleted删除在主 UI 线程上等待的任何循环(这将阻塞UI 并使其看起来“挂起”)。在中,重新启用在调用完成getVideoList时应重新启用的 UI 部分。BeginGetResponse

于 2012-08-07T19:53:56.860 回答