2012-10-11 229 views
0

我有一個列表視圖,顯示來自YouTube的視頻結果。一切工作正常,但我注意到的一件事是,它的工作方式似乎有點慢,這可能是由於我的代碼。有沒有關於如何讓這更好的建議?也許直接從url加載圖像,而不是使用webclient?從URL到列表視圖的圖像

我正在使用YouTube API從查詢返回的視頻供稿中添加循環中的listview項目。的一段代碼,我認爲是減緩下來是這樣的:

Feed<Video> videoFeed = request.Get<Video>(query); 
int i = 0; 
foreach (Video entry in videoFeed.Entries) 
{ 
string[] info = printVideoEntry(entry).Split(','); 
WebClient wc = new WebClient(); 
wc.DownloadFile(@"http://img.youtube.com/vi/" + info[0].ToString() + "/hqdefault.jpg", info[0].ToString() + ".jpg"); 

string[] row1 = { "", info[0].ToString(), info[1].ToString() }; 
ListViewItem item = new ListViewItem(row1, i); 
YoutubeList.Items.Add(item); 

imageListSmall.Images.Add(Bitmap.FromFile(info[0].ToString() + @".jpg")); 
imageListLarge.Images.Add(Bitmap.FromFile(info[0].ToString() + @".jpg")); 
} 
public static string printVideoEntry(Video video) 
{ 
    return video.VideoId + "," + video.Title; 
} 

正如你可以看到我使用的下載圖像,以便然後我可以在我的列表視圖中使用它們作爲圖像的Web客戶端。它的作品,但我關心的是速度..任何建議?也許不同的控制在一起?

+0

你應該在一個單獨的線程下載圖像。該線程應該填充imageLists,但要小心訪問UI線程。 –

+0

@尼克你有什麼例子嗎?這是我第一次使用winforms我更像一個asp.net類型的傢伙哈哈..感謝 – Andres

+0

你可以發佈你的代碼填充信息數組嗎? –

回答

0

好的,我希望這是你正在尋找的代碼,我無法測試它,因爲我沒有你正在使用的DLL,但我認爲它是確定的。

  Feed<Video> videoFeed = request.Get<Video>(query); 

      Thread th = new Thread(new ParameterizedThreadStart(GetImages)); 
      th.Start(videoFeed); 
      int i = 0; 
      foreach (Video entry in videoFeed.Entries) 
      { 
       string[] info = printVideoEntry(entry).Split(','); 
       string[] row1 = { "", info[0].ToString(), info[1].ToString() }; 
       ListViewItem item = new ListViewItem(row1, i++); 
       YoutubeList.Items.Add(item); 
      } 

     } 
     void GetImages(object arg) 
     { 
      Feed<Video> videoFeed = Feed<Video> arg; 
      foreach (Video entry in videoFeed.Entries) 
      { 
       string[] info = printVideoEntry(entry).Split(','); 
       WebClient wc = new WebClient(); 
       wc.DownloadFile(@"http://img.youtube.com/vi/" + info[0].ToString() + "/hqdefault.jpg", info[0].ToString() + ".jpg"); 
       ImageAdd(info[0]+".jpg"); 
      } 
     } 
     delegate void imageAdder(string imgName); 
     void AddImage(string imgName) 
     { 
      imageListSmall.Images.Add(Bitmap.FromFile(imgName + @".jpg")); 
      imageListLarge.Images.Add(Bitmap.FromFile(imgName + @".jpg")); 
      listView1.Refresh(); 
     } 
     void ImageAdd(string imgName) 
     { 
      this.Invoke(new imageAdder(AddImage), new object[] { imgName }); 
     } 

試試吧,如果你有問題,我會評論它。

+0

現在我認爲這仍然是下載它在該循環中找到的每個圖像?我是因爲我仍然看到wc.DownloadFile被稱爲..我想知道是否可以通過使用「http://img.youtube.com/vi/」url而不是FromFile() – Andres

+0

來避免這一切可以直接從流中創建位圖,但是您應該創建httprequests。該代碼是一種懶惰加載。很明顯,listview的填充速度比圖片的下載速度快。我希望我能夠幫到你,所以你可以自己繼續。 –