我有一个列表视图,我会从YouTube上显示视频结果。一切正常,但有一点我注意到它的工作方式似乎有点慢,这可能是由于我的代码。我有什么建议可以让它变得更好吗?也许直接从网址加载图片而不是使用网络客户端?
我正在使用YouTube API从查询返回的视频供稿中循环添加列表视图项。我认为减慢它的代码是:
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;
}
如您所见,我使用Webclient下载图像,然后我可以将它们用作listview中的图像。它有效,但我关心的是速度......有什么建议吗?也许是一个不同的控制?
答案 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 });
}
尝试一下,如果你遇到一些问题我会发表评论。