WP8 Async/Await begingetresponse不等待,最后运行

本文关键字:等待 最后 运行 begingetresponse Async Await WP8 | 更新日期: 2023-09-27 18:02:33

我可能误解了控制流程,因为从所有的帐户来看,这似乎应该工作。这是一个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()用于测试目的;它在"过去负载数据"之后打印。我希望BeginGetResponse在任务返回之前运行并完成操作(从而设置Key)。数据直接在控制台中打印出来,但不是按照期望的顺序打印出来——因此设置了Key并有一个值,但它是运行的最后一部分。有人能给我指出正确的方向和/或看看是什么导致了上面的问题吗?考虑到这一点,await操作符是否只是在等待Task返回,它在剥离其异步调用后返回?

WP8 Async/Await begingetresponse不等待,最后运行

BeginGetResponse启动一个异步进程(因此是回调),因此您不能保证它完成的顺序。请记住,BeginGetResponse中的代码实际上是一个单独的方法(参见闭包),它与getSingleStockQuote分开执行。您将需要使用await GetResponseAsync或(在我看来,更好的是—您可以大大简化代码)使用HttpClient。