2016-06-19 7 views
3

C# 비동기에 대해 혼동스러워합니다. 나는 병렬 작업 처리를 위해 비동기을 이해한다. 예를 들어 메소드가 A 및 B 태스크를 수행하고 비동기을 사용하면 A 및 B가 동시에 조치를 수행 할 수 있습니다. B는 A가 완료 될 때까지 기다릴 필요가 없습니다.ASP.NET 및 C# async

그러나 아래 예제 코드는 데이터베이스에서 데이터를 가져 오는 단일 작업 만 수행합니다. 즉, 병렬 작업에는 아무 것도 없습니다. 그런데 왜 비동기을 사용합니까?

비동기을 이해할 수 있도록 조언을주십시오.

[ResponseType(typeof(BookDetailDTO))] 
public async Task<IHttpActionResult> GetBook(int id) 
{ 
    var book = await db.Books.Include(b => b.Author).Select(b => 
     new BookDetailDTO() 
     { 
      Id = b.Id, 
      Title = b.Title, 
      Year = b.Year, 
      Price = b.Price, 
      AuthorName = b.Author.Name, 
      Genre = b.Genre 
     }).SingleOrDefaultAsync(b => b.Id == id); 
    if (book == null) 
    { 
     return NotFound(); 
    } 

    return Ok(book); 
} 
+1

https://msdn.microsoft.com/en-us/library/mt674882.aspx – Crowcoder

+0

최고의 기사/설명, 특히 '스레드'섹션 - 오해의 의미를 분명히합니다. –

+1

"async를 사용하면 A와 B가 동시에 작업을 수행 할 수 있습니다." * 정확하지 않습니다. 대부분의 경우 같은 시간에 * 아닙니다. 더 나은 방법은 "async/awaits는 복잡한 코드를 작성하지 않고 B의 결과를 기다리는 동안 프로그램을 쉽게 만들 수있는 환상적인 설탕"이라고 생각하는 것입니다. – mayu

답변

7

이 내용은 내 async ASP.NET article에 자세히 설명되어 있습니다. 요약하면 async은 스레드를 해제하여 작동하므로 다른 스레드에 사용할 수 있습니다.

의 의미는 병렬 작업에는 아무 것도 없습니다. 하지만 비동기를 사용하는 이유는 무엇입니까?

이 요청은 여러 가지 작업을 동시에 수행하지 않습니다. 비동기로 만들면 요청 속도가 전혀 빨라지지 않습니다.

그러나 전체적으로 응용 프로그램은 입니다.에는 다른 작업이 있습니다. 구체적으로 응답 할 수있는 다른 요청이 있습니다. async을 사용하면 스레드 풀 스레드가 활발하게 사용되지 않을 때마다 스레드 풀 스레드가 해제됩니다. 이렇게하면 응용 프로그램을 확장 할 수 있습니다 (백엔드가 확장 가능하다고 가정 할 때). 즉, async을 사용하면 스레드 풀을 최대한 활용할 수 있습니다.

0

그것은 aysnc를 사용하는 데이터베이스에 연결하고 약간의 시간이 걸릴 수있는 반응을 얻고 있으며이 동 기적으로 수행 된 경우 응용 프로그램이 대기 상태에있는 모든 시간을 고정 될 수 있기 때문이다.

호출을 비동기로 만들면 요청을 데이터베이스로 보내고 데이터를 반환하는 동안 응용 프로그램에서 다른 작업을 수행 할 수 있습니다.

-2

async으로 함수를 표시 한 다음 프로그램의 다른 지점에서 await 키워드를 사용하여 호출하면 async 메서드를 호출 한 스레드가 프로그램 실행을 차단하지 않고 해당 프로그램이 실행될 때까지 일시 중단 될 수 있습니다 당신의 대답을받습니다.

즉, 데이터베이스에서 데이터를 가져 오는 동안 전체 UI가 정지되지 않습니다.

+4

이 답변은 이것은 클라이언트 응용 프로그램이었습니다. 그러나 ASP.NET의 경우이 대답은 잘못되었습니다. 'async'는 HTTP 응답을 보내지 않습니다. –

+2

또한 스레드가 일시 중단되지 않습니다. – Crowcoder

+1

@StephenCleary 아, 네 말이 맞아. ASP.NET 태그를 완전히 놓쳤습니다. 그런 식으로, 내 대답은 정말 적합하지 않습니다 ... – Luca