【问题标题】:Synchronous WebClient Download In SilverlightSilverlight 中的同步 WebClient 下载
【发布时间】:2011-03-28 22:59:17
【问题描述】:

我需要下载一个字符串(特别是来自 PHP Web 服务的 JSON 数组结果),作为返回字符串的函数,而不是 DownloadStringAsync。我需要这个,因为我正在编写一个下载字符串的函数,然后将其转换为 JsonArray。

我正在使用 Visual Studio Ultimate 2010,我正在开发 Silverlight 应用程序,我们将不胜感激。

【问题讨论】:

  • 当一个同步 API 被故意省略时,为什么要强制 Silverlight 同步。为什么不问更好的问题:“我怎样才能异步执行此操作?”而不是试图将方形钉子砸入圆孔。
  • @spender 因为很多人(比如我)认为使用错综复杂的回调网络和事件处理程序进行编程会变得非常混乱,非常快。然而,尝试将方形钉子塞入圆孔可能同样麻烦,甚至更糟。
  • @spender 想想看,如果你有任何设计提示可以让异步编程更容易/更有条理,我(可能还有 OP)会全神贯注。
  • @Phil 看看我的回答,菲尔。自从我发现了协程后,我不再想在 Silverlight 中处理异步工作流时自欺欺人了。
  • Silverlight 尝试强制执行异步模型,因为主线程上的任何其他类型的活动都会阻塞 UI 活动。这是让用户熟悉使用线程来创建应用程序的权衡。您应该简单地调用此服务异步并在回调中通过测试它是否成功然后将其转换为 JsonArray 来处理结果。就我个人而言,我更倾向于使用 lambda 回调而不是连接事件处理程序,但每个人都需要权衡取舍。

标签: c# silverlight web-services json webclient


【解决方案1】:

您正在寻找的不是同步工作流(这在 Silverlight 中即使不是不可能,也是非常困难的)。相反,您希望能够按顺序管理异步工作流。您希望能够说“从 Web 服务下载此字符串,然后将字符串转换为 JSON 数组”,而无需处理回调和事件。

嗯,有好消息也有坏消息。好消息是这个问题有一个解决方案——它叫做Coroutines。协程是一种在最后一部分完成之前暂停执行连续代码的方法,即使该部分是异步的。

坏消息是协程不是在 C# 中原生实现的(尽管它们是 coming in C# 5)。您可以实现自己的顺序工作流,有一篇关于它的绝妙文章here。这是一篇很长的文章,如果你以前从未做过,这有点困难。

但不要绝望!有一个更简单的方法。 Caliburn.Micro 是一个 MVVM 框架,实际上有一个简单的协程实现。事实上,如果你真的想的话,你可以很容易地使用 Caliburn.Micro 协程,而无需使用框架的任何其他部分。 Caliburn.Micro 的创建者 Rob Eisenberg 有一篇关于协程的优秀文章,包括理论和实践,here

基本上你的代码最终会看起来像这样:

public IEnumerable<IResult> DoTheThing() {
  var json = new FetchString("webserviceaddress.asmx");
  yield return json;
  var jsonStr = json.Result;
  var jsonArray = createJsonArray(jsonStr);
  // do stuff with the array
}

至少我认为这就是你要找的:)

【讨论】:

    【解决方案2】:

    或者,如果您使用的是 MVVM Light,Matt Hamilton 为该框架创建了协程:http://matthamilton.net/coroutines-with-mvvm-light

    【讨论】:

      猜你喜欢
      • 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
      相关资源
      最近更新 更多