асинхронная операция / задачи в WP7 / Silverlight - PullRequest
1 голос
/ 27 марта 2011

Когда приложение загружается, я хотел бы прочитать файл локального ресурса, проанализировать его и заполнить структуру данных, а затем пользовательский интерфейс.Я хотел бы, чтобы это произошло в потоке, не связанном с пользовательским интерфейсом, и как мне этого добиться?Файл в формате Json, и я использую библиотеку json.net для его десериализации.Когда я проверял это, даже индикатор выполнения не отображался в течение этого времени, и я попытался использовать инструментарий: performanceprogressbar, и даже он не показывает мне индикатор выполнения, поэтому мне интересно, какое будет правильное решение.

Ответы [ 2 ]

8 голосов
/ 28 марта 2011

Вам нужен класс BackgroundwWorker.Вы используете это так: -

var bw = new BackgroundWorker()
bw.DoWork += (s, args) =>
{
     // This runs on a background thread.

     var resource = System.Windows.Application.GetResourceStream(new Uri(string.Format("testProj;component/{0}", fileName), UriKind.Relative));
     StreamReader streamReader = new StreamReader(resource.Stream);
     string jsonText = streamReader.ReadToEnd();

     jsonList = JsonConvert.DeserializeObject<List<ComicItem>>(jsonText);
     // Other stuff with data. 
};
bw.RunWorkerCompleted += (s, args) =>
{
     // Do your UI work here this will run on the UI thread.
     // Clear progress bar.
};

// Set progress bar.

bw.RunWorkerAsync();

Кстати, вы уверены, что не можете использовать DataContractJsonSerializer?Тот факт, что вы чувствуете необходимость делать это асинхронно, предполагает, что объем данных достаточно велик, а объем памяти по сравнению с WP7 выше.Подход JSON.NET требует, чтобы вы прочитали весь поток JSON в строку, прежде чем десериализовать его, тогда как DataContractJsonSerializer может десериализировать непосредственно из потока.

0 голосов
/ 28 марта 2011
  1. Запустите отображение индикатора выполнения, установив для IsIndeterminate значение true
  2. Получение и загрузка ресурсов с использованием фонового рабочего потока
  3. Пользовательский интерфейс можно обновлять только в потоке пользовательского интерфейса
  4. Когда все сделано, установите IsIndeterminate в False
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...