2013-07-05 3 views
43

C#에서 비동기 작업이 어떻게 기다리고 있는지 이해하려고하는데 한 가지가 많이 혼란 스럽습니다. await 키워드를 사용하는 모든 메서드는 async로 표시되어야한다는 것을 알고 있습니다. 필자는 await 키워드가있는 행이 적중되면 해당 행 아래의 코드가 실행되지 않는다는 것을 이해합니다. 대기중인 라인에서 명령문을 수행하기 위해 비동기 조작이 시작되고 제어는 실행을 계속할 수있는 호출 메소드로 리턴됩니다.어떻게 C#에서 비동기 작업을 기다리고 있습니까

질문 1 :이 가정은 맞습니까? 아니면 await 키워드 아래의 코드가 여전히 실행됩니까?

두 번째로 서비스 메소드를 비동기로 호출하고 결과를 반환해야한다고 가정합니다. return 문은 await 키워드 아래에 있습니다.

질문 # 2 : 비동기 호출이 완료된 후 또는 그 전에 return 문이 언제 실행됩니까?

질문 # 3 : 해당 서비스 호출의 결과를 사용하고 비동기 작업이 도움이되지 않아 결과가 반환 될 때 호출하는 메소드가 손상되기를 원합니다. 나는 이것이 synchronus를 만드는 Result 속성을 사용하여 수행 할 수 있음을 이해한다. 그러나 DB 작업에서 비동기 사용은 실제로 대부분의 응용 프로그램에서 실제로 시간의 80 %를 차지합니다.

질문 4 : DB 작업과 함께 비동기를 사용하려면 어떻게해야합니까? 가능하고 권장 할 만한가?

질문 5 : scenraio가 비동기 작업을 유용하게 사용할 수있는 이유는 모든 API가 현재 이유없이 비동기 작업을하고있는 것 같습니다. 또는 비동기 연산을 사용하는 지점을 놓쳤습니까?

API가 이유없이 asyn 메서드를 만들고 있다고 말하면 메서드가 뭔가를 반환해야하고 계산이 완료 될 때까지 어떻게 리턴 할 수 있는지에 대한 호출은 여전히 ​​의미가 차단되지 않습니다. 결과가 반환 될 때까지 쓸모 없을거야?

+4

많은 질문을하고 있습니다. 단 하나 집중된 질문을하면 SO가 가장 잘 작동합니다. 두 가지 이상의 질문이있는 경우 별도로 게시하십시오. – svick

+20

@svick 어떻게 든 혼란스러운 초보자를위한 아주 예의 바른 설명이 아닙니다. 어쨌든 그는 5 가지를 묻습니다.하지만 실제로는 비동기의 의미와 유용성에 초점을 맞추고 있습니다. IMO를 기다리고 있습니다. –

+1

@Svick 나는 MDSN이 나를 혼란스럽게 만들고 내 마음 속에 많은 질문을 남겼습니다. 다른 사람이 같은 문제가 있다면 어쩌면이 스레드를보고 비동기 op를 더 잘 이해할 수 있습니다. 내 모든 질문은 하나의 주제와 관련이 있습니다. 5 가지 질문을 게시하고 누군가가 모두를 볼 수 있기를 희망하지 않습니다. –

답변

43

MSDN explains everything.

가끔 바닐라 워드 프로세서 (특히 MSDN)가 특정 상황에 적용하기 어려울 수 있음을 이해하지만, 귀하의 요점을 살펴 보겠습니다.

질문 1 :이 가정은 맞습니까? 아니면 await 키워드 아래의 코드가 여전히 실행됩니까?

"await"키워드 아래의 코드는 비동기 호출이 완료 될 때만 실행됩니다. 그 동안 메소드가 "async"로 표시되기 때문에 메소드가 완료 될 때까지 메소드 호출자에게 제어가 리턴됩니다. 위의 MSDN 링크에서 :

Task<string> getStringTask = client.GetStringAsync("http://msdn.microsoft.com"); 

// You can do work here that doesn't rely on the string from GetStringAsync. 
DoIndependentWork(); 

// The await operator suspends AccessTheWebAsync. 
// - AccessTheWebAsync can't continue until getStringTask is complete. 
// - Meanwhile, control returns to the caller of AccessTheWebAsync. 
// - Control resumes here when getStringTask is complete. 
// - The await operator then retrieves the string result from getStringTask. 
string urlContents = await getStringTask; 

나는 의견이 꽤 설명 생각합니다.

두 번째로 서비스 메소드를 비동기로 호출하고 결과를 반환해야한다고 가정합니다. return 문은 await 키워드 아래에 있습니다.

질문 # 2 : 때 전에 return 문 히트는, 비동기 호출이 완료된 후 또는?

.

질문 # 3 : 나는 결과가 반환되었을 때 호출하는 방법을 타격 할 원인 않을 수 있도록 해당 서비스의 호출과 비동기 작업의 결과를 사용하고 싶습니다. 나는 이것이 synchronus를 만드는 Result 속성을 사용하여 수행 할 수 있음을 이해한다. 그러나 DB 작업에서 비동기 사용은 실제로 대부분의 응용 프로그램에서 실제로 시간의 80 %를 차지합니다.

서비스를 완료하기 위해 관련없는 3 개의 DB 쿼리를 작성한 다음 결과를 기반으로 계산을 수행 한 다음 완료하십시오. 이 작업을 순차적으로 수행했다면 각 작업이 완료 될 때까지 기다려야합니다. 비동기 호출을 사용하면 C#이 세 개의 쿼리를 병렬로 실행하므로 서비스가 훨씬 빨리 완료 될 수 있습니다.

또한 Task를 반환하는 작업을 Futures로 사용할 수 있습니다. 선물을 기반으로 작업을 병렬화하고 결과를 병합하는 방법에 대해 여러 패턴이 논의되는 MSDN on Futures을 참조하십시오.

서비스가 하나의 DB 호출 만 필요로한다면 비동기라고 부를 수 있습니다.

질문 4 : DB 작업에서 비동기를 사용하려면 어떻게해야합니까? 가능하고 권장 할 만한가?

이제 비동기 메서드 ReadAsync and NextResultAsync이 ADO.NET에 포함됩니다.

좋습니다.이 토론은 내가 쓸 수있는 것보다 훨씬 완벽합니다. here.

질문 # 5 : 작업이 유용 할 비동기 것 scenraio하는 모든 API를 그냥 이유없이 이제 비동기 작업을 것 같다? 또는 비동기 연산을 사용하는 지점을 놓쳤습니까?

비동기 작업은 스레드 문제로 실행하지 않고 장기 실행중인 작업을 쉽게 병렬 처리하는 데 매우 유용합니다. 만약 당신의 방법이 단지 하나의 일, 또는 단순한 (빠른) 일의 순서를 수행한다면, 그렇다면 비동기로가는 것은 쓸모가 없다. 그러나 하나 이상의 장기 실행 작업이있는 경우 스레드 관리보다 비동기 적으로 병렬화하기가 훨씬 쉽고 오류가 적습니다.

+1

와우! 고마워요, 당신은 모든 것을 매우 이해하기 쉬운 방식으로 설명했습니다. 나는 MSDN을 살펴 봤지만 어느 라인이 언제 실행될지를 설명하는 숫자가 많은 다이어그램을 보았습니다. 그리고 그것은 나를 더욱 혼란스럽게 만들었습니다. 답장을 보내 주셔서 감사합니다! –

+0

따옴표 붙은 코드는 인용 부호에 정의되거나 포함되지 않은 "AccessTheWebAsync"를 참조합니다. 컨테이너 메소드라고 가정합니다. – Manachi

14

대부분 질문에 대한 답변은 officialdocumentationan intro post입니다.

질문 4 : DB 작업에서 비동기를 사용하려면 어떻게해야합니까? 가능합니까

Entity Framework 6 (현재 베타)은 async을 지원합니다. 하위 레벨 데이터베이스 API는 비동기 작업을 지원합니다. 그들 중 일부 (예 : SQLite)는 async을 직접 지원합니다. 다른 사람들은 간단한 async 호환 래퍼를 작성해야합니다.

... 및 권장?

백엔드에서 확장 불가능한 단일 데이터베이스 시스템과 통신하는 프런트 엔드 서버 (예 : ASP.NET)를 쓰지 않는 한 예. 이 특정 경우에는 프런트 엔드 스케일을 만드는 데 아무런 포인트가 없습니다. 왜냐하면 백 엔드가 어쨌든 그것을 조정할 수 없기 때문입니다.

질문 # 5 : 작업이 유용 할 비동기 것 scenraio하는 모든 API를 그냥 이유없이 이제 비동기 작업을 것 같다? 또는 비동기 연산을 사용하는 지점을 놓쳤습니까? 비동기 작업의

장점은 다음과 같습니다

클라이언트 (UI) 측면에서
  1. 는 응용 프로그램이 응답 남아있다.
  2. 서버 측에서 응용 프로그램의 확장 성이 좋습니다.
+0

답안이 끝날 때 간단하지만 완벽하게 명시된 혜택. – joelc

관련 문제