我正在處理一些通過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();
}
}
});
你不需要使用'await'嗎? –
我的理解是,task1.Result會隱式調用.Wait ...但我會嘗試您的建議。我不熟悉Wait和Await之間的區別:) –
'await'是一個編譯器構造,它不會阻塞線程,但它會重新設置所有代碼以將'await'之後的所有內容移動到另一個回調函數中。 –