我需要下载一个字符串(特别是来自 PHP Web 服务的 JSON 数组结果),作为返回字符串的函数,而不是 DownloadStringAsync。我需要这个,因为我正在编写一个下载字符串的函数,然后将其转换为 JsonArray。
我正在使用 Visual Studio Ultimate 2010,我正在开发 Silverlight 应用程序,我们将不胜感激。
最佳答案
您正在寻找的不是同步工作流程(这在 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
}
至少我认为这就是您正在寻找的:)
关于c# - Silverlight 中的同步 WebClient 下载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5466020/