2012-10-11 148 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的填充速度比图片的下载速度快。我希望我能够帮到你,所以你可以自己继续。 –