Загрузка и анализ нескольких файлов XML с использованием WP7 - PullRequest
0 голосов
/ 09 июня 2011

Я столкнулся с немного запутанной проблемой, и я не уверен, что проблема в том, что я не знаю о делегате WebClient "OpenReadCompletedEvent", или если есть проблема с моим выбранным решением, используемым на моемсерверные сценарии, с которыми приложение взаимодействует.

Вот моя проблема:

У меня есть класс, который определяет название видеоигры, я использую WebClient для асинхронного открытия RSS-канала для чтения, который, когда завершено, продолжает извлекать предоставленную пользователем информацию об этом заголовке, используя тот же метод.Для этого я перебираю каждое название видеоигры, проанализированное из RSS-канала (RSS-канал GameStop.com для будущих игр), здесь я сталкиваюсь с проблемами, у меня нет возможности синхронизировать все эти делегаты OpenReadCompletedEvent, илиничего такого, о чем я знаю.

Прямо сейчас мой код становится смущающим и запутанным, и я считаю, что это неверно: Примечание: игры - это список объектов Game.

List<Thread> threads = new List<Thread>();
            for(int i = 0; i < games.Count; i++)
            {
                threads.Add(new Thread(downloadHype));
                threads[i].Start(i);
            }

public void downloadHype(object data)
        {
            int index = (int)data;
            String tempUrl = String.Format("http://slyduck.com/hypemachine/frontend.php?intent=2&guid={0}", games[index].GuidString);

            WebClient client = new WebClient();
            client.OpenReadAsync(new Uri(tempUrl));
            client.OpenReadCompleted += new OpenReadCompletedEventHandler(
                delegate(object sender, OpenReadCompletedEventArgs e)
                {
                    if (e.Error == null)
                    {
                        XDocument xdoc = XDocument.Load(e.Result);
                        games[index].Hype = (from item in xdoc.Descendants("hype")
                                     select new Hype()
                                     {
                                         Id = uint.Parse(item.Element("id").Value),
                                         GameId = uint.Parse(item.Element("game_id").Value),
                                         UserId = uint.Parse(item.Element("user_id").Value),
                                         Score = (uint.Parse(item.Element("score").Value) == 1)
                                     }).ToList();
                    }
                });
}

IsЕсть ли более простой способ для меня это организовать?Я рассмотрел возможность отправки массива игровых указателей в качестве параметра GET или POST, чтобы уменьшить количество мусора, создаваемого при создании такого количества WebClients, но я не уверен, является ли это правильным решением.

I 'Мы изучили классы Synchronization и Parallel, однако они не доступны в .NET-реализации SilverLight.

Любая помощь будет принята с благодарностью.Спасибо!

1 Ответ

0 голосов
/ 09 июня 2011

Вы породили слишком много тем. Помните, новый поток сразу же потребляет 1 МБ виртуального адресного пространства.

Если у вас есть один пользователь, у которого есть идентификатор (GUID), получите данные по гиду (как вы знаете), но ваш XML должен быть в виде списка Hype, а не просто как один.

Другими словами, используйте различные структуры XML. Тогда вам просто понадобится одна нить backgroud и один WebClient для получения всего списка.

...