이전에 클라이언트 또는 서비스에서 Async-Await을 적용하는 것과 관련된 this 질문을 게시했습니다. 질문과 밀접하게 관련되어 있으므로이 질문을 계속하기 전에 질문을 읽으십시오.Async-Await의 실질적인 이점은 무엇입니까?
답변에 따라 C# 4.0 (TPL) 및 C# 5.0 (Async - Await)에 대한 코드를 테스트했습니다. 서비스에서 제공하는 메서드의 비동기 및 동기화 버전을 사용하여 서비스를 호출하고 각 경우에 사용되는 스레드 수를 비교합니다. 다음 내가 자원이 사용 테스트 사용하고 코드입니다 :
주요 방법는
List<Task<string>> tasksList = new List<Task<string>>();
List<int> asyncThreads = new List<int>();
List<int> tplThreads = new List<int>();
Stopwatch watch = new Stopwatch();
watch.Start();
// Call the Async version of the method
for (int i = 0; i < 500; i++)
{
tasksList.Add(GetNameFromServiceAsync("Input" + i.ToString(), asyncThreads));
}
Task.WaitAll(tasksList.ToArray());
watch.Stop();
foreach (var item in asyncThreads.Distinct())
{
Console.WriteLine(item);
}
Console.WriteLine("(C# 5.0)Asynchrony Total Threads = " + asyncThreads.Distinct().Count());
Console.WriteLine(watch.ElapsedMilliseconds.ToString());
watch.Restart();
tasksList.Clear();
// Call the normal method
for (int i = 0; i < 500; i++)
{
tasksList.Add(GetNameFromService("Input" + i.ToString(), tplThreads));
}
Task.WaitAll(tasksList.ToArray());
watch.Stop();
foreach (var item in tplThreads.Distinct())
{
Console.WriteLine(item);
}
Console.WriteLine("(C# 4.0)TPL Total Threads" + tplThreads.Distinct().Count());
Console.WriteLine(watch.ElapsedMilliseconds.ToString());
비동기 및 동기화
static async Task<string> GetNameFromServiceAsync(string name, List<int> threads)
{
Console.WriteLine(" Start Current Thread : " + System.Threading.Thread.CurrentThread.ManagedThreadId);
var task = await client.GetNameAsync(name);
threads.Add(System.Threading.Thread.CurrentThread.ManagedThreadId);
// Console.WriteLine("End GetNameFromServiceAsync Current Thread : " + System.Threading.Thread.CurrentThread.ManagedThreadId);
return task;
}
static Task<string> GetNameFromService(string name, List<int> threads)
{
var task = Task<string>.Factory.StartNew(() =>
{
threads.Add(System.Threading.Thread.CurrentThread.ManagedThreadId);
// Console.WriteLine("GetNameFromService Current Thread : " + System.Threading.Thread.CurrentThread.ManagedThreadId);
return client.GetName(name);
});
return task;
}
지금은했습니다 서비스에 대한 호출 답변을 작성하고 다음 결과를 확인하십시오.
- 서비스를 500 회 호출하면 4-5 개의 스레드 만 사용합니다.
- TPL 호출은 약 44-45 스레드를 만듭니다.
- 비동기 호출 시간은 약 17 - 18 초입니다.
- TPL 호출 시간은 약 42 - 45 초입니다.
내 결과에 대한 의견을 남기고 다른 커뮤니티 회원들에게도 유용 할 수 있기를 바랍니다. 그것은 내 이전 질문의 답이 무엇입니까 ?? 내 관찰 Q.
편집
우리가 비동기-기다리고 있습니다 대신 TPL의 Task.Factory.startNew를 사용하는 경우, 다음이 적은 스레드를 소비하는 것으로 결론 지었다. 이게 정확히 맞습니까? 그렇지 않은 경우, 그와 같은 비교를 할 때 올바른 방향은 무엇입니까?
Q. 비동기식을 배우고 있기 때문에 나는 일종의 비교와 견고한 코드로 그 가치를 증명하고 싶습니다.
귀하의 궁금한 점은 무엇입니까? –
async를 사용하면 메모리 이점을 얻을 수 있습니다 (더 적은 리소스가 사용됩니다). 이것은 내가 이전의 질문에서 얻었던 것이거나 내가 이해하고 알고 싶은 것입니다. async-await를 사용하여 확장 성 이점에 대해 묻고 싶습니다. 내가 결론을 내린 것과 인라인인가? –
중요한 장점 중 하나는 동기 코드를 수행 할 때 사용자가 비동기 문제에 직면했다고 말할 수 없다는 것입니다. –