Синхронная загрузка веб-клиента в Silverlight - PullRequest
2 голосов
/ 29 марта 2011

Мне нужно загрузить строку (в частности, результат массива JSON из веб-службы PHP) как функцию, которая возвращает строку, а не DownloadStringAsync. Мне это нужно, потому что я пишу функцию, которая загружает строку, а затем преобразует ее в JsonArray.

Я использую Visual Studio Ultimate 2010, я разрабатываю приложение Silverlight, и любая помощь будет оценена.

Ответы [ 2 ]

4 голосов
/ 29 марта 2011

То, что вы ищете, это не синхронные рабочие процессы (это было бы очень сложно, если не невозможно, в Silverlight).Скорее вы хотите иметь возможность управлять асинхронными рабочими процессами последовательно .Вы хотите иметь возможность сказать «Загрузите эту строку из веб-службы, а затем преобразовать строку в массив JSON», не беспорядочно обрабатывая обратные вызовы и события.

Что ж, есть хорошие и плохие новости,Хорошей новостью является то, что есть решение этой проблемы - оно называется Coroutines .Сопрограммы - это способ остановить выполнение последовательного фрагмента кода до тех пор, пока последняя часть не будет завершена, даже если эта часть асинхронна.

Плохая новость заключается в том, что сопрограммы изначально не реализованы в C # (хотя они и поступает в C # 5 ).Вы можете реализовать свои собственные последовательные рабочие процессы, и здесь есть совершенно блестящая статья здесь .Это длинная статья, и это немного сложно, если вы никогда не делали этого раньше.

Но не отчаивайтесь!Есть более простой способ. Caliburn.Micro - это инфраструктура MVVM, которая на самом деле имеет простую реализацию сопрограмм.На самом деле, вы можете довольно легко использовать сопрограммы Caliburn.Micro без использования какой-либо другой части фреймворка, если вы действительно этого хотите.Создатель Caliburn.Micro, Роб Айзенберг, имеет отличную статью о сопрограммах, включая теорию и практику, здесь .

В основном ваш код будет выглядеть примерно так:

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
}

По крайней мере, я думаю, это то, что вы ищете:)

0 голосов
/ 09 мая 2011

Или, если вы используете MVVM Light, Мэтт Хэмилтон создал сопрограммы для этой платформы: http://matthamilton.net/coroutines-with-mvvm-light

...