【问题标题】:Is it possible to make synchronous network call on ui thread in wpf (windows phone)是否可以在 wpf(Windows 手机)的 ui 线程上进行同步网络调用
【发布时间】:2013-02-06 15:50:05
【问题描述】:

是否可以在 WPF(Windows Phone 8)的 UI 线程上进行同步网络调用。 (我知道这是缺点,但我仍然需要这个功能来使它与一些移植的代码一起工作) 尝试使用autoresetevent 方法。由于死锁,它阻塞了 ui 线程并且应用程序永远挂起。

甚至尝试使用 webclient。 UI 线程仍然被阻塞,应用程序永远挂起。

任何帮助...

【问题讨论】:

  • 同步调用的想法是它会使用你的 UI 线程的资源,这会阻塞你的 UI。如果您不希望 UI 被阻止,您应该使用异步调用。
  • Windows Phone 不使用 WPF(它基于 Silverlight 4)。
  • 抱歉,它只是没有被阻止。该应用程序永远挂起。
  • 有时您只需要阻止 UI 线程,例如在您处理应用程序停用时。您需要等到所有清理工作完成,并且需要同步进行,否则应用程序将在您准备好之前退出。

标签: silverlight networking httpwebrequest windows-phone-8 webclient


【解决方案1】:

来自异步网络操作的回调在 UI 线程上排队。如果你阻塞线程等待它,回调将永远不会到达,因为它正在等待访问同一个线程。

不过,您还有其他选择……如果您已移植代码,则必须对其进行更改以支持异步操作。

【讨论】:

  • 如果我使用这样的代码:`var client = new HttpClient(); var task = client.GetAsync("只是一些地址不会损坏"); var data = await task.ConfigureAwait(false);" 那么回调不再在 UI 线程上运行,但死锁仍然存在问题(我有一些不同的问题,但我认为他们'相关)。
【解决方案2】:

这是一个非常糟糕的主意 - 我发现意外地这样做实际上会导致您的 UI 完全死锁。您需要使用异步方法。

【讨论】:

  • 是的,我知道这很糟糕。但我需要实现这个功能。在我的情况下,我没有任何其他选择
  • ...这个答案和您的经验表明您无法选择使用同步网络 API,因为您的应用会永远挂起。
  • fyi,我对 windows 8 有同样的要求,使用 httpclient 解决了这个问题。但相同的代码在 windows phone 8 上不起作用。(httpClient 适用于 windows phone) var hc = new HttpClient(); var task = hc.GetStringAsync(urlpath); var response = task.Result;
猜你喜欢
  • 1970-01-01
  • 2014-01-27
  • 2015-05-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-06
  • 1970-01-01
相关资源
最近更新 更多