IAsyncResult未完成并锁定UI

时间:2012-08-01 18:56:48

标签: c# asynchronous iasyncresult

我正在进行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
}

2 个答案:

答案 0 :(得分:1)

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

希望这有帮助。

答案 1 :(得分:0)

异步操作完成时将调用

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