我可能误解了控制流程,因为从各方面来看,这似乎应该有效。这是一款Windows phone 8应用程序。我正在尝试发出Web请求,并相应地显示返回的数据。我试图通过以下方法获取数据(此处称为' Key'):
public Task<String> getSingleStockQuote(String URI)
{
return Task.Run(() =>
{
String key = null;
HttpWebRequest request = HttpWebRequest.Create(URI) as HttpWebRequest;
HttpWebResponse response;
try
{
request.BeginGetResponse((asyncres) =>
{
HttpWebRequest responseRequest = (HttpWebRequest)asyncres.AsyncState;
response = (HttpWebResponse)responseRequest.EndGetResponse(asyncres);
key = returnStringFromStream(response.GetResponseStream());
System.Diagnostics.Debug.WriteLine(key);
}, request);
}
catch (Exception e)
{
System.Diagnostics.Debug.WriteLine("WebAccessRT getSingleStockQuote threw exception");
key = String.Empty;
}
return key;
});
}
......我这样称呼这个方法:
WebAccessRT rt = new WebAccessRT();
await rt.getSingleStockQuote(stockTagURI);
System.Diagnostics.Debug.WriteLine("Past load data");
BeginGetResponse中的WriteLine()用于测试目的;它在&#34;过去加载数据&#34;之后打印。我希望BeginGetResponse在任务返回之前运行并完成操作(从而设置Key)。数据在控制台中打印出来,但不是按照所需的顺序打印 - 因此Key已设置并具有值,但它是最后一个运行的部分。有人能指出我正确的方向和/或看看导致上述问题的原因是什么?考虑到这一点,是await运算符SIMPLY等待Task返回,它在关闭异步调用后返回?
答案 0 :(得分:1)
BeginGetResponse
启动异步进程(因此回调),因此您无法保证其完成的顺序。请记住,BeginGetResponse
中的代码实际上是一个单独的方法(请参阅闭包),它与getSingleStockQuote
分开执行。您需要使用await GetResponseAsync
或(imo,甚至更好 - 您可以大大简化代码)使用HttpClient。