同步WebClient在Silverlight中下载

时间:2011-03-28 22:59:17

标签: c# silverlight web-services json webclient

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

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

2 个答案:

答案 0 :(得分:4)

您正在寻找的不是同步工作流程(这在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
}

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

答案 1 :(得分:0)

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