2014-01-25 16 views
1

비동기 프로그래밍 및 기다리는 방법에 관한 질문이 있습니다. 메서드가 비동기 일 때 특정 코드의 실행을 기다릴 수 있지만, 좀 더 이해하고 싶습니다. 나는 모든 곳에서 비동기 사용하지만,비동기 메서드 및 대기

public async void Starter() 
{ 
    string username = await GetUserNameFromDBAsync(); 
    bool updated = await UpdateUserTown(); 
} 

public async static Task<string> GetUserNameFromDBAsync() 
{ 
    using(DBContext context = new DBContext()) 
    { 
     return await context.User.FindByIdAsync(currentid).Name; 
    } 
} 

public async static Task<bool> UpdateUserTown() 
{ 
    using(DBContext context = new DBContext()) 
    { 
     User user = await context.User.FindUserByIDAsync(currentid); 
     user.Town="New Town"; 
     try 
     { 
      context.SaveChangesAsync(); 
     } 
     catch(Exception ex) 
     {return false} 
     return true; 
    } 
} 

확인이 코드를 수행하지만 내가 가진 모든 시간을 기다리고하려면 .. :

내가하는 방법이 상상 :

그래서 나는 특정 질문이 있습니다 그래서 기본적으로 성능을 위해이 모든 비동기를 제거하고 기다리지 않고 마치 그것을 수행 할 때와 정확히 똑같을 것입니다 ...

아니면 내가 놓친 것일까 요?

답변

6

데스크톱 응용 프로그램에서 async은 성능에 관한 것이 아니라 응답성에 관한 것입니다. 장기 실행 I/O 바운드 작업을 수행하는 동안 응용 프로그램의 GUI가 정지되는 것을 원하지는 않습니다. 이를 달성하는 일반적인 방법은 스레딩을 통해 이루어 지지만 스레드는 값 비싸고 제대로 동기화하기 어려우며 웹 서비스에서 데이터를 가져 오는 동안 UI를 반응 적으로 유지하기 만하면 과도합니다.

컨트롤러가있는 웹 응용 프로그램에서는 컨트롤러가 실행되는 스레드가 스레드 풀로 돌아가서 더 많은 요청을 처리 할 수 ​​있기 때문에 더 많은 요청을 동시에 처리 할 수 ​​있습니다. await이 완료 될 때까지 기다리는 동안.

코드 노트 : 은 이벤트 처리기가 아니면 async void으로 표시해야합니다. awaitasync void 메서드를 사용할 수 없으며 발생하는 예외를 catch 할 수 없습니다. 대신 메서드에서 아무 것도 반환하지 않으면 async Task을 사용하십시오.

+0

웹 응용 프로그램에서도 볼 수 있기 때문에 데이터베이스에서 응답을 기다려야한다면 괜찮은지 알 수 있습니다. 여전히 대기해야한다면 비동기 사용의 요점은 무엇입니까?)))하지만 지금은 이것은 다른 웹 브라우저에서 다른 요청을하는 동안 서버가 될 수 있다는 것을 의미합니다.이 경우에는 웹 애플리케이션에 대해 더 많이 말하고 있기 때문입니다.) – Alnedru

+0

Btw 나는 물을 싶습니다. 리소스가 있습니까? 웹 애플리케이션과 비동기에 대해 읽을 수 있습니까? – Alnedru

관련 문제