2014-04-22 2 views
3

비동기 (*Async/async) 함수는 두 번 호출되며, 한 번은 await이고 다른 함수는없는 것입니다.비동기 대기중인 작업

만약 내가 await를 사용한다면, 비동기 함수가 실행될 때까지 기다렸다가 다음 줄을 실행할 것입니까?

await db.SaveChangesAsync(); 
//Some code here 

그리고, 나는 그것이 비동기 함수가 완료 될 때까지 기다리지 않고 그 아래에있는 코드를 실행을 계속합니다 await를 사용하지 않는 경우? 이 async 기능에 관해서

db.SaveChangesAsync(); 
//Some code here 

오전, 나는 바로 여기에 또는 기다리고는 필수입니다?

+1

제목을 편집했습니다. "[제목에"태그 "가 포함되어 있어야합니까?] (http://meta.stackexchange.com/questions/19190/)"합의가 "아니오, 그렇지 않아야합니다"로 표시되어야합니다. –

답변

8

대기 시간을 사용하면 async 기능이 실행될 때까지 대기 한 후 다음 줄을 실행합니다.

반환 방법에 따라 다릅니다. 미래의 값을 나타내는 Task[<T>]을 반환합니다. Task이 이미 완료된 경우 동 기적으로 계속 실행됩니다. 그렇지 않으면 현재 메서드의 나머지 부분이 비동기 부분에서 완료를보고 할 때 호출되는 대리자 콜백 인 연속으로 추가됩니다.

무엇을합니까 아니요은 비동기 부분이 계속되는 동안 호출 스레드를 차단합니다.

그리고 기다림을 사용하지 않으면 async 함수가 완료 될 때까지 기다리지 않고 아래 코드를 계속 실행합니다. 이 async 기능에 관해서

... 또는이 기다리고

예는 필수입니다?

호출 할 때? 필수는 아니지만 편리하게 만듭니다. 일반적으로 이러한 함수는 Task[<T>]을 반환하며 다른 코드를 통해 소비 할 수도 있습니다. .ContinueWith(...), .Wait, .Result 등을 사용하거나 Task을 완전히 무시할 수 있습니다. 비동기 함수에 대한 예외가 어딘가의 일 필요가 있기 때문에 마지막으로 나쁜 생각입니다. 예외가 발생하지 않으면 매우 나쁜 일이 발생합니다.

그러나, 그들을 작성 : 당신이 async 방법을 작성하고 거기에 await 키워드가없는 경우, 컴파일러는 당신이 아마 뭔가 잘못하고있는 것을 나타내는 경고를 발표 할 예정이다. 다시 말하지만, 엄격하게는 이 아니며, 필수 사항은입니다.

+0

좋은 답변입니다. 고마워. 의심을 많이 털어 놓았다. +1 남자 :) –

+0

"아주 나쁜 일들은 예외가 관찰되지 않으면 일어난다"에 관해서.이것은'Task'를 무시할 때 뭔가 적극적으로 일어난다는 인상을줍니다; 실제로 예외가 삼킨 경우 ('async void'를 사용하지 않는 한). 즉, 매우 나쁜 일은 예외를 삼켜 버렸고 프로그램이 일관성없는 상태에 빠지거나 버그가 무시된다는 것입니다. –