任务 .Result始终为null

我正在研究一些代码来通过Task.Factory.FromAsync(在WP7应用程序中)执行HttpRequest。

任务的Result属性始终为null,但我知道请求本身是正确的,因为如果我将它粘贴到我的浏览器或Fiddler中,它就可以工作。 这是我的代码:

string _url = string.Format("http://requestapi.net/{0}/{1}/{2}", "objects","partitionKey","pkey1"); var request = (HttpWebRequest)WebRequest.Create(_url); request.Method = "GET"; Task task1 = Task.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

更新:这是有效的。 迈克是对的 – 任务刚刚没有完成执行。 我不确定为什么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(); } } }); 

您基本上是在创建任务,但在检查结果之前不等待它完成。 从评论中看来,WP7运行时和框架的工作方式与完整的CLR略有不同,后者会在您尝试获取结果时阻止。 Silverlight运行时是非常反阻塞的东西。

您将需要使用await关键字(在较新的运行时可用,或者如果您有VS2012,则使用Async Targeting Pack )或ContinueWith方法以异步方式启动任务。