2012-08-01 25 views
2

我正在進行REST調用,服務器端響應採用XML形式。我正在異步進行此調用。我已經測試它作爲一個控制檯應用程序,它的工作原理應該如此。但是,當我在XBOX,上測試它時,異步請求永遠不會完成。我的processVideo方法分析XML並將項目放入List中。我需要從另一個類引用此列表,所以我添加了(result.IsCompleted == false)以確保異步調用在我引用和使用List之前完成。看起來,異步請求從來沒有完成,並鎖定用戶界面,任何想法?IAsyncResult未完成並鎖定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

永遠不是很長的時間。你真的*等了多久? – phoog 2012-08-01 19:01:50

+0

@phoog? 。比我需要等待的時間還要長。該列表非常短,UI被鎖定,意味着它沒有做它應該做的事情。 – Fabii 2012-08-01 19:10:10

回答

1

while循環是你的問題。您不應該等待異步調用完成。您應該在發送給Begin方法的異步回調中執行您想要執行的任何操作。原因是UI設置了用於異步回調的同步上下文。這種方式的作用是將回調編組到UI線程中,以便維護UI上下文。由於您的while循環阻塞了您的UI線程,因此回調從不會發生,導致異步調用未完成。

希望這會有所幫助。

0

getVideoList將在異步操作完成時被調用。如果您需要您的用戶界面在此操作完成之前不允許執行某些操作,則必須在致電BeginGetResponse之前禁用它們。刪除在主UI線程上等待IsCompleted的任何循環(這將的UI,並使其看起來「掛起」)。在getVideoList中,重新啓用當對BeginGetResponse的調用完成時應重新啓用的UI部分。