我正在研究一些代码来通过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<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
更新: 这有效。迈克是对的 - 任务刚刚没有完成执行。我不确定为什么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();
}
}
});
答案 0 :(得分:1)
您基本上是在创建任务,但在检查结果之前不等待它完成。从评论中看来,WP7运行时和框架的工作方式与完整的CLR略有不同,后者会在您尝试获取结果时阻止。 Silverlight运行时是非常反阻塞的东西。
您需要使用await
关键字(可在较新的运行时使用,或使用Async Targeting Pack,如果您有VS2012)或ContinueWith
方法以异步方式启动任务。