C\#가사 파일 을 다운로드 하 는 동기 화 및 비동기 화 방법
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));
}
마지막 프레젠테이션:다운 로드 를 클릭 하면 프로그램 이 끊 어 지 는 것 처럼 스 레 드 가 기다 리 고 비동기 다운 로드 는 원활 하 다.
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
WebView2를 Visual Studio 2017 Express에서 사용할 수 있을 때까지Evergreen .Net Framework SDK 4.8 VisualStudio2017에서 NuGet을 사용하기 때문에 패키지 관리 방법을 packages.config 대신 PackageReference를 사용해야...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.