2011-06-09 44 views
0

我遇到了一个令人困惑的问题,我不确定问题是我没有意识到WebClient“OpenReadCompletedEvent”委托,或者如果有在我的服务器端脚本中使用我选择的解决方案时遇到的问题,与应用程序进行交互。使用WP7下载和解析多个XML文件

这里是我的问题:

我有一个类定义了视频游戏标题,我使用Web客户端异步打开阅读,其中,完成后继续使用,以获取有关该标题用户提交的信息的RSS Feed同样的方法。为此,我循环播放从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(); 
        } 
       }); 
} 

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

我查看了同步类和并行类,但是它们在SilverLight的.NET实现中不可用。

任何帮助将不胜感激。谢谢!

回答

0

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

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

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

+0

那么,上面使用的脚本只是抓取任何特定游戏的所有炒作分数,由游戏指南选择。当应用程序启动时,我需要下载炒作分数以及将要显示的每个游戏(在任何给定时刻通常为15)的评论(以类似的方式完成)。我可以发出一个请求来抓取所有游戏的所有炒作,然后在C#中对其进行排序,但是我期望游戏能够在非常频繁的基础上循环,因此,所有游戏的所有炒作最终都会导致下载量变得很大。 – travis134 2011-06-09 07:29:58