2012-11-30 19 views
2

我正在處理一些通過Task.Factory.FromAsync(在WP7應用程序)中執行HttpRequest的代碼。任務<WebResponse>。結果始終爲空

任務的Result屬性始終爲空,但我知道請求本身是正確的,因爲如果將它粘貼到我的瀏覽器或Fiddler中,它可以工作。這是我的代碼:

 string _url = string.Format("http://requestapi.net/{0}/{1}/{2}", 
      "objects","partitionKey","pkey1"); 
     var request = (HttpWebRequest)WebRequest.Create(_url); 
     request.Method = "GET"; 

     Task<WebResponse> task1 = Task<WebResponse>.Factory.FromAsync(
      (callback, o) => ((HttpWebRequest)o).BeginGetResponse(callback, o) 
      , result => ((HttpWebRequest)result.AsyncState).EndGetResponse(result) 
      , request); 

     task1.Start(); 
     WebResponse webResponse = task1.Result; 
     string responseString; 

     using (var response = (HttpWebResponse)webResponse) 
     { 
      using (Stream streamResponse = response.GetResponseStream()) 
      { 
       StreamReader reader = new StreamReader(streamResponse); 
       responseString = reader.ReadToEnd(); 
       reader.Close(); 
      } 
     } 

更新:在WP7上,TPL只能通過Nuget使用。我在這裏下載它: http://nuget.org/packages/System.Threading.Tasks

UPDATE: This works。邁克是對的 - 任務只是沒有完成執行。我不確定爲什麼task1.Result沒有自動等待(它應該隱式調用task1.wait()),但這是工作代碼。請讓我知道,如果你看到其他問題!這段代碼從task1.Start()過去的位置開始 - 現在被刪除。

  //task1.Start(); 
      string responseString; 
      task1.ContinueWith((antecedent) => 
      { 

       WebResponse webResponse = task1.Result; 

       using (var response = (HttpWebResponse)webResponse) 
       { 
        using (Stream streamResponse = response.GetResponseStream()) 
        { 
         StreamReader reader = new StreamReader(streamResponse); 
         responseString = reader.ReadToEnd(); 
         reader.Close(); 
        } 
       } 
      }); 
+1

你不需要使用'await'嗎? –

+0

我的理解是,task1.Result會隱式調用.Wait ...但我會嘗試您的建議。我不熟悉Wait和Await之間的區別:) –

+1

'await'是一個編譯器構造,它不會阻塞線程,但它會重新設置所有代碼以將'await'之後的所有內容移動到另一個回調函數中。 –

回答

1

你基本上是在創建一個任務,但沒有等到它完成之前檢查結果。從評論中看來,WP7運行時和框架與完整的CLR的工作方式有點不同,當你試圖獲得結果時,CLR會阻塞。 Silverlight運行時非常反 - 阻塞 - 事物。

你要使用await關鍵字(這是可在新的運行時間或使用,如果你有VS2012的Async Targeting Pack)或ContinueWith方法來異步啓動任務。

+0

謝謝麥克!這有幫助。 –