C\#가사 파일 을 다운로드 하 는 동기 화 및 비동기 화 방법

얼마 전에 한 편C\#Lrc 가사 파일 해석을 써 서 lrc 파일 을 분석 하고 여러 시간 대의 합병 을 지원 합 니 다.본 고 는 가사 파일 을 다운로드 하여 동기 화 와 비동기 화 방법 을 연구 하고 자 한다.
 lrc 파일 은 네트워크 곳곳에서 볼 수 있 습 니 다.우 리 는 몇 가지 방법 을 통 해 얻 을 수 있 습 니 다.가장 간단 한 것 은 다른 사람의 인터페이스 입 니 다.예 를 들 어: http://geci.me/api/lyric/아래 제 이 슨 으로 돌아 가 는 것 을 사랑 해 야 한다.그러면 우 리 는 가사 파일 을 쉽게 얻 을 수 있다. 

{
 "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",
   "song": "    ",
   "artist_id": 2,
   "sid": 3712941
  }
 ]
}

C\#Lrc 가사 파일 해석에서 우 리 는 Lrc 클래스 를 만 들 었 습 니 다.우 리 는 이 클래스 에 방법 을 계속 추가 합 니 다.
동기 다운로드 실현 
SearchLrc 정적 방법 을 만 듭 니 다.이 방법 은 가 사 를 검색 합 니 다.먼저 로 컬 폴 더(내 폴 더 는 D:\lrc\)에 lrc 파일 이 존재 하 는 지 확인 하고 존재 하지 않 으 면 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();
  }

비동기 다운로드 실현 
SearchLrcAsyc 정적 방법 을 만 듭 니 다.이 방법 은 반환 값 이 없 기 때문에 우 리 는 리 셋 방법 을 매개 변수 로 합 니 다(이 리 셋 방법 은 Lrc 를 매개 변수 로 하고 반환 값 이 없습니다).비동기 다운 로드 는 주로 json 데이터 와 파일 의 다운로드 에 나타 납 니 다. 

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 는 비동기 다운로드 문자열 을 구현 하여 호출 스 레 드 를 막 지 않 습 니 다.
 DownloadStringComplete 이 벤트 는 다운로드 문자열 이 완 료 된 후에 실 행 됩 니 다.우 리 는 사용 할 수 있다.
 DownloadStringasync 방법의 구 조 는 파 라 메 터 를 전달 하여 DownloadStringComplete 내부 에서 우리 의 Action함 수 를 호출 합 니 다.우리 의 매개 변 수 는 두 개 이기 때문에 하나의 대상 으로 포장 해 야 한다. 

public void DownloadStringAsync(
 Uri address,
 object userToken
)
address
다운로드 할 URI 가 포 함 된 Uri 입 니 다.
userToken
사용자 정의 대상 입 니 다.이 대상 은 비동기 작업 을 완료 할 때 호출 되 는 방법 으로 전 달 됩 니 다.DownloadStringComplete 방법 에서 e.UserState 를 통 해 가 져 옵 니 다.

 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));
  }

마지막 프레젠테이션:

다운 로드 를 클릭 하면 프로그램 이 끊 어 지 는 것 처럼 스 레 드 가 기다 리 고 비동기 다운 로드 는 원활 하 다.
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

좋은 웹페이지 즐겨찾기