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が必要な場合は、を呼び出す前にそれらを無効にする必要がありますBeginGetResponseIsCompletedメインUIスレッドで待機しているループをすべて削除します(これにより、UIがブロックされ、「ハング」しているように見えます)。で、呼び出しが完了しgetVideoListたときに再度有効にする必要があるUIの部分を再度有効にします。BeginGetResponse

于 2012-08-07T19:53:56.860 に答える