2011-06-09 41 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