【问题标题】:Async-Await vs Task<T>.Result on WP8WP8 上的 Async-Await 与 Task<T>.Result
【发布时间】:2012-12-05 03:25:59
【问题描述】:
 var factory1 = new TaskFactory();
 var task1 =  factory1.FromAsync<WebResponse>(request.BeginGetResponse, request.EndGetResponse, null).Result;

以上代码在 windows 8 和 windows store 上运行,但是当我尝试在 windows phone 8 中运行它时,它不起作用。它只是冻结并且没有任何响应,看起来运行任务需要很长时间。

我的目的是同步调用web服务,不使用asycn和await方法。

【问题讨论】:

  • 不要那样做。它将冻结,并可能使 UI 线程死锁。
  • 这就是发生在我身上的事。但是有什么办法吗?

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


【解决方案1】:

我的目的是同步调用web服务,不使用asycn和await方法。

你不应该那样做。 WP8/Win8 应该是异步的。 asyncawait 使异步编程变得容易。

我有a blog post 详细解释了Result 死锁情况(虽然我有点惊讶它在这种情况下发生)。简而言之,async 方法试图在 UI 线程上恢复,但 UI 线程被阻塞等待 async 方法完成。

为什么要同步?

【讨论】:

  • :D 我必须为许多接口类实现方法,我只是不想改变它的结构,因为它是同步的
【解决方案2】:

这应该会发生。当您请求 Result 时,应用程序将停止并等待,直到您真正得到结果。这意味着您同步等待。

如果你想异步等待,你必须使用await关键字,因为它的语义是:当你得到结果,然后继续执行;同时,继续 UI 工作

这就是等待(隐含同步)和异步等待(又名等待)之间的区别。

【讨论】:

    猜你喜欢
    • 2015-02-12
    • 2016-12-03
    • 1970-01-01
    • 2013-09-04
    • 1970-01-01
    • 2020-05-03
    • 2013-03-02
    相关资源
    最近更新 更多