【问题标题】:Async methods doesn't seem to work on Windows Phone异步方法似乎不适用于 Windows Phone
【发布时间】:2015-01-13 15:47:50
【问题描述】:

我有以下代码(WPF,Windows Phone 8.1):

HttpClient client = new HttpClient();
var httpResult = client.GetAsync(feed.Url, ct);
string feedData = await httpResult.Result.Content.ReadAsStringAsync();

var sf = new SyndicationFeed();
sf.Load(feedData);

我正在尝试调试此代码。但是,在这行之后:

string feedData = await httpResult.Result.Content.ReadAsStringAsync();

调试器似乎让应用程序自行运行并且永远不会到达下一行。这是为什么?我做错了吗?

【问题讨论】:

  • 是异步的,有信息就会到达。
  • @CodingChief 我无法想象通过 Wifi 下载简短的 XML 文件需要超过 1 分钟。
  • 正如约翰所说,您可能陷入了僵局,这就是为什么要花这么多时间。
  • 请注意Windows Phone与WPF不同;请考虑删除标签和内容。

标签: c# asynchronous windows-phone-8.1


【解决方案1】:

根据您是调用 result 还是等待上游某处的任务,这可能会导致死锁,如 Stephen Cleary 的 blog post 所述。

通过等待client.GetAsync() 来缓解此问题,并在可能的情况下使用ConfigureAwait 以最大限度地减少死锁的可能性:

HttpClient client = new HttpClient();
var httpResult = await client.GetAsync(feed.Url, ct).ConfigureAwait(false);
string feedData = await httpResult.Content.ReadAsStringAsync().ConfigureAwait(false);

var sf = new SyndicationFeed();
sf.Load(feedData)

【讨论】:

  • 另外,将任何上游 WaitResult 调用更改为使用 await
  • @StephenCleary 实际上这是核心问题——我等待上面通过 Wait 发布的方法。但这让我有点困扰 - 有没有一种(有效的)方法可以强制同步执行一些异步任务?
  • 这项工作是异步完成的。 ConfigureAwait(false) 表示当工作完成时,您并不关心使用哪个线程来恢复其余工作。
  • @Spook: No.
  • @StephenCleary 好吧,我表达自己错了。通过“强制同步运行”,我的意思是等待任务完成,然后再进一步成功。这应该由 Wait 来完成,但它会导致死锁。那么是否有另一种正确的方法来做到这一点?
猜你喜欢
  • 1970-01-01
  • 2011-03-09
  • 1970-01-01
  • 1970-01-01
  • 2011-08-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多