Windows Phone 7 - загрузка большого файла XML - PullRequest
4 голосов
/ 13 июля 2011

Я пытаюсь загрузить XML-файл в свое приложение и показать его в ListBox. Проблема в том, что размер xml-файла составляет около 5 МБ, а загрузка телефона занимает около 40 секунд. и когда телефон блокирует экран и возвращается обратно, это занимает еще 40 секунд. Я пытался использовать изолированное хранилище для хранения данных на нем, но это не улучшило производительность. Это мой код для загрузки данных:

XDocument loadedData = XDocument.Load("BigFile.xml");
            var data = from query in loadedData.Descendants("w")
                       orderby (string)query.Element("e")
                       select new myClass
                       {
                           First = (string)query.Element("a"),
                           Second = (string)query.Element("e")
                       };
        ListBox.ItemsSource = data.ToList<myClass>();

Есть ли способ ускорить загрузку?

Ответы [ 2 ]

4 голосов
/ 13 июля 2011

Для повышения производительности вы можете сделать следующее:

  • Убедитесь, что загрузка перемещена из пользовательского интерфейса
  • Разбейте файл на несколько более мелких и загружайте их по одному и обновляйте список по мере добавления каждого.
  • Если возможно, переформатируйте данные (перед добавлением в приложение), чтобы они включали только абсолютные минимальные данные, используемые приложением.
  • Преобразование файла в другой формат (попробуйте JSON), который может быть проанализирован быстрее.
  • (При использовании 7.1) поместите данные в базу данных и разверните их в XAP.
  • Пересмотреть необходимость иметь так много данных. Большие / длинные списки трудно просматривать на устройстве с небольшим экраном.
0 голосов
/ 13 июля 2011

Вы можете попробовать поместить этот код в фоновый поток, чтобы выполнить его, в то время как вы можете заниматься другими вещами в основном потоке.

delcare "private BackgroundWorker backgroundWorker;"в частичном классе MainPage

Поместите этот код в конструктор MainPage () (или MainPage_loaded)

// Инициализирующий фоновый рабочий действительно отображает избранное

        if (backgroundWorker == null)
        {
            backgroundWorker = new BackgroundWorker();
            backgroundWorker.DoWork += new DoWorkEventHandler(backgroundWorker_DoWork);
        }
        backgroundWorker.RunWorkerAsync();

, а затем имеетВаш код здесь:

    void backgroundWorker_DoWork(object sender, DoWorkEventArgs e)
    {
       XDocument loadedData = XDocument.Load("BigFile.xml");
        var data = from query in loadedData.Descendants("w")
                   orderby (string)query.Element("e")
                   select new myClass
                   {
                       First = (string)query.Element("a"),
                       Second = (string)query.Element("e")
                   };
    ListBox.ItemsSource = data.ToList<myClass>();

    }

Надеюсь, это поможет.

...