下载&使用WP7解析多个XML文件

时间:2011-06-09 03:25:21

标签: c# php multithreading windows-phone-7 webclient

我遇到了一个令人困惑的问题,我不确定问题是我不知道WebClient“OpenReadCompletedEvent”委托,或者我所选择的解决方案是否存在问题服务器端脚本,应用程序与之交互。

这是我的问题:

我有一个定义视频游戏标题的类,我使用WebClient异步打开RSS提要进行阅读,完成后继续使用相同的方法获取用户提交的有关该标题的信息。为此,我循环浏览从RSS提要解析的每个视频游戏标题(GameStop.com的即将推出的游戏的RSS提要),这是我遇到问题的地方,我无法保持所有这些OpenReadCompletedEvent委托同步,或者没有我知道的。

现在我的代码变得尴尬和令人费解,我认为这是不正确的: 注意:游戏是游戏对象列表。

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();
                    }
                });
}

我有更简单的方法来组织这个吗?我考虑过将一组游戏guids作为GET或POST参数发送的可能性,以减轻创建这么多WebClient所产生的一些垃圾,但我不确定这是否是正确的解决方案。

我研究过同步类和并行类,但它们在SilverLight的.NET实现中不可用。

非常感谢任何帮助。谢谢!

1 个答案:

答案 0 :(得分:0)

你产生了太多的线程。记住,一个新线程会立即消耗1MB的虚拟地址空间。

如果您有一个具有ID(GUID)的用户,请通过guid获取数据(如您所知),但您的XML应该是Hype的列表,而不仅仅是一个。

换句话说,使用XML的不同结构。然后你只需要一个背景线程和一个WebClient来获取整个列表。