【问题标题】:HttpWebRequest synchronous on Windows Phone 8HttpWebRequest 在 Windows Phone 8 上同步
【发布时间】:2014-11-07 18:24:34
【问题描述】:

为了设计/重用一个可用于 WPF 应用、Windows Phone 8 应用和更高版本的 Windows 8/RT 应用的库,我们需要进行一些 HttpWebRequest 调用,最好是同步调用,以免破坏现有应用。

问题是已经存在的代码使用 ManuelResetEvent 来同步进行 Web 请求。它在 WPF 和 Win 8 RT 中完美运行,但在 Windows Phone 8 中(至少在模拟器上),程序挂起如下:

ManualResetEvent with HttpWebRequest on WP7

我尝试将调用都封装在一个任务或线程中,但它仍然是一样的。

因此,我将代码更改为使用 async / await,它当然非常适合 WP8 和 Win 8,但我们的桌面应用程序的目标是 .NET 4.0 框架以兼容 XP。当然,有适用于 Visual Studio 2012 的 Async Targeting Pack,但这有两个问题:

  • 应使用 async / await 重写 / 仔细测试桌面应用程序代码
  • Mono 的稳定版本不支持 async/await(也许在 Windows 上使用 Async Targeting Pack 编译然后在 Mono 运行时运行它可以工作?应该进行测试)

所以,我尝试同步调用带有 async 标记的方法,只是为了看看。我使用了这里给出的 AsyncHelpers :

How would I run an async Task<T> method synchronously?

它适用于 WPF 和 Win 8 应用程序,但它在 Windows Phone 8 上挂起。

是否有人知道如何拥有可以在任何地方使用而无需挂在 Windows Phone 上的同步代码(或具有等待/异步的同步外观代码)?

【问题讨论】:

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


    【解决方案1】:

    也许你云使用任务的Result 属性。它适用于 .NET 4.0/4.5 和 Windows Phone 8。

    【讨论】:

      【解决方案2】:

      HttpWebRequest 使用 UI 线程来处理请求,不要问我为什么。

      因此,如果您尝试通过锁定 UI 线程来等待结果,您将获得死锁条件,因为您会锁定 UI 线程直到请求未完成,而当 UI 线程被锁定时请求不会完成。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多