【问题标题】:WP8 Async/Await begingetresponse not waiting, gets run lastWP8 Async/Await begingetresponse 不等待,最后运行
【发布时间】:2014-05-09 08:20:01
【问题描述】:

我可能误解了控制流程,因为从各方面来看,这似乎应该有效。这是一个 Windows 手机 8 应用程序。我正在尝试发出网络请求,并相应地显示返回的数据。我正在尝试通过以下方法获取数据(此处称为“密钥”):

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 已设置并具有一个值,但它是运行的最后一部分。有人可以指出我正确的方向和/或查看导致上述问题的原因吗?考虑到这一点,await 操作符是否只是在等待任务返回,任务在关闭异步调用后返回?

【问题讨论】:

  • 使用GetResponseAsyncasync/await。如果您不能使用async/await,请检查:stackoverflow.com/q/21345673/1768303
  • 你也可以使用回调机制,在回调事件处理程序中做“过去加载数据”。

标签: c# windows-phone-8 asynchronous async-await


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-12-11
    • 2016-03-08
    • 1970-01-01
    • 2020-08-03
    • 2021-01-26
    • 2019-04-14
    • 2018-09-23
    • 1970-01-01
    相关资源
    最近更新 更多