C#下载歌词文件的同步和异步方法
前段时间写了一篇C#解析Lrc歌词文件,对lrc文件进行解析,支持多个时间段合并。本文借下载歌词文件来探讨一下同步和异步方法。 { "count": 2,"code": 0,"result": [ { "aid": 2727794,"lrc": "http://s.geci.me/lrc/327/32793/3279317.lrc","song": "不得不爱","artist_id": 2,"sid": 3279317 },{ "aid": 3048347,"lrc": "http://s.geci.me/lrc/371/37129/3712941.lrc","sid": 3712941 } ] } 在C#解析Lrc歌词文件中我们创建了Lrc类,我们继续在该类中添加方法。 同步下载实现 public static Lrc SearchLrc(string musicName) { string path = @"D:lrc" + musicName + ".lrc"; if (System.IO.File.Exists(path)) { return InitLrc(path); } else { return DownloadLrc(musicName,path); } } 下载歌词利用WebClient,首先用DownloadString方法将获取json,再利用JavaScriptSerializer反序列化为自定义对象,这样就得到了lrc文件的url,最后通过url将lrc文件下载到本地,再调用InitLrc方法返回Lrc对象。 public class TempJosnMain { public int count { get; set; } public int code { get; set; } public List<TempJsonChild> result { get; set; } } public class TempJsonChild { public int aid { get; set; } public string lrc { get; set; } public string song { get; set; } public int artist_id { get; set; } public int sid { get; set; } } static Lrc DownloadLrc(string musicName,string path) { if (musicName.Contains("-")) musicName = musicName.Split('-')[1].Trim(); string url = "http://geci.me/api/lyric/" + musicName; WebClient wc = new WebClient(); string json = wc.DownloadString(url); JavaScriptSerializer js = new JavaScriptSerializer(); TempJosnMain res = js.Deserialize<TempJosnMain>(json); if (res.count > 0) { wc.DownloadFile(new Uri(res.result[0].lrc),path); wc.Dispose(); return InitLrc(path); } return new Lrc(); } 异步下载实现 public static void SearchLrcAsyc(string musicName,Action<Lrc> action) { string path = @"D:lrc" + musicName + ".lrc"; if (System.IO.File.Exists(path)) { action(InitLrc(path)); } else { DownloadLrcAsyc(musicName,path,action); } } WebClient的DownloadStringAsync实现异步下载字符串,不会阻止调用线程。 public void DownloadStringAsync( Uri address,object userToken ) address public class CallbackObject { public string path { get; set; } public Action<Lrc> action { get; set; } } static void DownloadLrcAsyc(string musicName,string path,Action<Lrc> action) { if (musicName.Contains("-")) musicName = musicName.Split('-')[1].Trim(); string url = "http://geci.me/api/lyric/" + musicName; WebClient wc = new WebClient(); CallbackObject co = new CallbackObject() { action = action,path = path }; wc.DownloadStringCompleted += new DownloadStringCompletedEventHandler(wc_DownloadStringCompleted); wc.DownloadStringAsync(new Uri(url),co); } static void wc_DownloadStringCompleted(object sender,DownloadStringCompletedEventArgs e) { JavaScriptSerializer js = new JavaScriptSerializer(); TempJosnMain res = js.Deserialize<TempJosnMain>(e.Result); if (res.count > 0) { WebClient wc = sender as WebClient; if (wc == null) wc = new WebClient(); CallbackObject co = e.UserState as CallbackObject; wc.DownloadFileCompleted += new System.ComponentModel.AsyncCompletedEventHandler(wc_DownloadFileCompleted); wc.DownloadFileAsync(new Uri(res.result[0].lrc),co.path,co); } } static void wc_DownloadFileCompleted(object sender,System.ComponentModel.AsyncCompletedEventArgs e) { CallbackObject co = e.UserState as CallbackObject; co.action(InitLrc(co.path)); } 最后演示: 点击下载时会有线程等待感觉像程序”卡死”,而异步下载则非常流畅。 以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持编程小技巧。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |