2012-10-01 5 views
6

이전에 클라이언트 또는 서비스에서 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. 비동기식을 배우고 있기 때문에 나는 일종의 비교와 견고한 코드로 그 가치를 증명하고 싶습니다.

+8

귀하의 궁금한 점은 무엇입니까? –

+0

async를 사용하면 메모리 이점을 얻을 수 있습니다 (더 적은 리소스가 사용됩니다). 이것은 내가 이전의 질문에서 얻었던 것이거나 내가 이해하고 알고 싶은 것입니다. async-await를 사용하여 확장 성 이점에 대해 묻고 싶습니다. 내가 결론을 내린 것과 인라인인가? –

+0

중요한 장점 중 하나는 동기 코드를 수행 할 때 사용자가 비동기 문제에 직면했다고 말할 수 없다는 것입니다. –

답변

12

클라이언트 측 async (동기 코드와 비교)은 일반적으로 약간의 비용 인의 메모리에서 응답 속도를 향상시킵니다.

(동기 코드와 비교할 때) 서버 쪽 async은 일반적으로 메모리/스레드 사용을 줄임으로써 확장 성을 향상시킵니다. 이러한 이점은 클라이언트 측 async (다중 스레드 코드와 비교)에도 적용됩니다.

두 가지 모두 극단적 인 일반화이며 틀린 상황이 있습니다.

업데이트 :

나의 관찰은 우리가 비동기-기다리고 있습니다 ...를 사용하는 경우, 다음이 적은 스레드를 소비하는 것으로 결론 지었다.

async/await 유지 보수 가능한 비동기 코드가 가능합니다. 그 자체로 스레드를 만드는 것과 아무런 관련이 없습니다.그러나 백그라운드 작업을 만들 때 종종 Task.Run (또는 Task.Factory.StartNew)과 함께 사용됩니다.

나는 비동기식 학습을하고 있기 때문에, 나는 일종의 비교와 견고한 코드로 그 가치를 증명하고 싶다.

asyncawait은 컴파일러 변환입니다. 비동기 프로그램을 작성하는 것이 더 쉽습니다.

동기식 코드와 비교하면 대개 향상된 응답 성과 확장 성을 볼 수 있습니다. 그것들을 기존의 비동기 코드와 비교하면 일반적으로 약간이 될 것이지만 코드 유지 관리 측면에서는 그 이상을 보완 할 것입니다.

+0

스티븐 감사합니다. 내 질문을 업데이트했습니다. –

+0

답변이 업데이트되었습니다. –

관련 문제