【问题标题】:DownloadStringTaskAsync on WP7 hangs when retrieving ResultWP7 上的 DownloadStringTaskAsync 在检索结果时挂起
【发布时间】:2011-09-20 21:16:25
【问题描述】:

我使用 Async CTP SP1 将一堆 WP7 代码转换为使用 DownloadStringTaskAsync 而不是 DownloadStringAsync。它没有用,所以我把我的代码整理了一堆,最后得到了这两行:

var wc = new WebClient();
var result = wc.DownloadStringTaskAsync("http://www.weather.gov").Result;

如果我在我的 Windows 机器上使用控制台应用程序运行此方法。它按我的预期工作,我得到一个包含 weather.gov 内容的字符串。如果我在空白 WP7 应用程序的 App 构造函数中运行相同的 2 行,它会在等待 Result 可用时挂起。

谁能帮我修复这些线路,以便它们可以在电话上工作?或者这是 CTP 中的一个错误,我现在应该跳过它。

【问题讨论】:

    标签: c# windows-phone-7 async-ctp


    【解决方案1】:

    Windows Phone 在 UI 线程上返回 HTTP 请求。通过访问Result,您将阻塞 UI 线程,从而使响应无法返回。

    考虑到您使用的是异步 CTP,为什么要阻止?

    var result = await wc.DownloadStringTaskAsync("http://www.weather.gov");
    

    【讨论】:

    • Richard 就在这里——你使用的是异步 API,所以你不应该阻塞它的结果。使用 Async CTP 使用它的正确方法是在该方法及其调用链上添加 async 修饰符。那么链式方法调用而不是直接调用更像是“await LowerMethodCall(...)”。最后要提防的是,就像 Result 属性一样,Wait() 不应在 UI 线程上的 Tasks 上调用,除非您确定这些任务不需要 UI 线程来处理即可完成。
    • 有道理,谢谢。我的实际代码使用等待/异步,我在试图弄清楚发生了什么时发现了这个问题,并想我会问。
    猜你喜欢
    • 2015-01-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-26
    • 1970-01-01
    • 2019-03-14
    • 2020-08-04
    • 1970-01-01
    相关资源
    最近更新 更多