저는 C# 5의 비동기 기능을 처음 사용합니다. 나는이 두 가지 구현 사이의 차이를 이해하려고 노력 해요 :Async-await Task.Run vs HttpClient.GetAsync
구현을 1 :
private void Start()
{
foreach(var url in urls)
{
ParseHtml(url);
}
}
private async void ParseHtml(string url)
{
var query = BuildQuery(url); //BuildQuery is some helper method
var html = await DownloadHtml(query);
//...
MyType parsedItem = ParseHtml(html);
SaveTypeToDB(parsedItem);
}
private async Task<string> DownloadHtml(string query)
{
using (var client = new HttpClient())
try
{
var response = await client.GetAsync(query);
return (await response.Content.ReadAsAsync<string>());
}
catch (Exception ex)
{
Logger.Error(msg, ex);
return null;
}
}
구현 2 :
private void DoLoop()
{
foreach(var url in urls)
{
Start(url);
}
}
private async void Start(url)
{
await Task.Run(() => ParseHtml(url)) ;
}
private void ParseHtml(string url)
{
var query = BuildQuery(url); //BuildQuery is some helper method
var html = DownloadHtml(query);
//...
MyType parsedItem = ParseHtml(html);
SaveTypeToDB(parsedItem);
}
private string DownloadHtml(string query)
{
using (var client = new WebClient())
{
try
{
return client.DownloadString(query);
}
catch (Exception ex)
{
Logger.Error(msg, ex);
return null;
}
}
}
는 차라리 두 번째 구현을 사용하십시오 그것은 내 코드에서 메소드에 대한 비동기 서명이 덜 필요하기 때문입니다. 나는 HttpClient 클래스를 사용하는 것이 새로운 작업을 사용하고 대신 그것을 기다리는 이점을 이해하려고 노력하고있다.
두 구현간에 차이점이 있습니까?
' 'async'signatures' - 그들에 대해 신경 쓰지 마라. "비동기"는 이전 코드와의 호환성을 유지하는 "마커"일뿐입니다. 5.0 이전 버전에서는 "await"라는 이름의 변수/함수를 사용할 수있었습니다. 그러나 오래된 메서드는 "비동기"키워드가 없기 때문에 코드는 C# 5.0을 사용하여 여전히 컴파일됩니다 (변경없이). – igrimpe