await(C# 참조)
await 바뀌게 작업이 완료 될 때까지 메서드 실행을 일시 중단 하는 비동기 메서드를 작업에 적용 되는 연산자입니다.작업 진행 중인 작업을 나타냅니다.
비동기 메서드는 await 사용 하 여 수정 해야는 비동기 키워드.사용 하 여 정의 된 이러한 메서드는 async 한정자를 일반적으로 포함 된 하나 이상의 await 식 이라고는 비동기 메서드.
[!참고]
async 및 await 키워드는 Visual Studio 2012에 도입 되었습니다.해당 버전의 새로운 기능에 대 한 내용은 Visual Studio 2012 의 새로운 기능.
비동기 프로그래밍에 대 한 소개를 참조 하십시오. Async 및 Await를 사용한 비동기 프로그래밍(C# 및 Visual Basic).
작업의 await 연산자가 적용 일반적으로 구현 하는 메서드 호출에서 반환 값을이 작업 기반 비동기 패턴.값 형식의 예로 Task 또는 Task<TResult>.
다음 코드에서 HttpClient 메서드 GetByteArrayAsync 반환 된 Task<byte[]>, getContentsTask.작업이 완료 되 면 실제 바이트 배열을 생성 하는 약속입니다.await 연산자가 적용 된 getContentsTask 의 실행을 일시 중단할 SumPageSizesAsync 까지 getContentsTask 완료 되.호출자에 게 제어를 반환 하는 한편 SumPageSizesAsync.때 getContentsTask 가 완료 된 후에 await 식을 계산 하는 바이트 배열입니다.
private async Task SumPageSizesAsync()
{
// To use the HttpClient type in desktop apps, you must include a using directive and add a
// reference for the System.Net.Http namespace.
HttpClient client = new HttpClient();
// . . .
Task<byte[]> getContentsTask = client.GetByteArrayAsync(url);
byte[] urlContents = await getContentsTask;
// Equivalently, now that you see how it works, you can write the same thing in a single line.
//byte[] urlContents = await client.GetByteArrayAsync(url);
// . . .
}
중요 |
---|
전체 예제를 보려면 연습: Async 및 Await를 사용하여 웹에 액세스(C# 및 Visual Basic)을 참조하십시오.샘플에서 다운로드할 수 개발자 코드 샘플 Microsoft 웹 사이트에서.이 예제에서 AsyncWalkthrough_HttpClient 프로젝트입니다. |
이전 예제와 같이 경우 await 반환 하는 메서드 호출의 결과에 적용 되는 Task<TResult>, 유형을 다음의 await TResult 식인.경우 await 반환 하는 메서드 호출의 결과에 적용 되는 Task, 유형을 다음의 await 식 void입니다.다음 예제에서는 차이 보여 줍니다.
// Keyword await used with a method that returns a Task<TResult>.
TResult result = await AsyncMethodThatReturnsTaskTResult();
// Keyword await used with a method that returns a Task.
await AsyncMethodThatReturnsTask();
await 식입니다 실행 하는 스레드를 차단 하지 않습니다.대신이 바뀌게 작업에서 연속 작업으로 비동기 메서드의 나머지를 서명할 컴파일러가.컨트롤은 다음 비동기 메서드 호출자에 게 반환합니다.작업이 완료 되 면 실행 했던 비동기 메서드 이력서와 연속 작업을 호출 합니다.
await 식 바로 바깥쪽의 본문에만 발생할 수 있습니다 메서드, 람다 식 또는 무명 메서드의 표시 됩니다는 async 한정자입니다.용어 기다립니다 해당 컨텍스트에서만에서 키워드 역할을 합니다.다른 곳으로 식별자로 해석 됩니다.메서드, 람다 식 또는 무명 메서드 내에서 await 식 수 없습니다 발생 동기 함수는 쿼리 식에서의 본문에 catch 또는 finally 블록는 예외 처리 문을, 블록에서는 lock 문, 나는 안전 하지 않은 컨텍스트.
예외
대부분의 비동기 메서드 반환 된 Task 또는 Task<TResult>.반환 된 작업의 속성의 상태와 작업 완료 여부, 비동기 메서드는 예외를 발생 시킨 여부 취소 되었습니다 및 최종 결과 기록에 대 한 정보를 수행 합니다.await 연산자는 속성에 액세스 합니다.
예외를 일으키는 작업 반환 비동기 메서드 기다립니다 경우는 await 연산자는 예외를 다시 throw 합니다.
취소 된 작업 반환 비동기 메서드 기다립니다 경우는 await 연산자를 다시 throw 된 OperationCanceledException.
단일 작업 오류가 상태에 여러 예외를 반영할 수 있습니다.예를 들어, 작업 결과에 대 한 호출의 수 Task.WhenAll.이러한 작업을 기다립니다 때 await 작업 예외 중 하나만 다시 throw 합니다.그러나 예외를 다시 throw 됩니다 예측할 수 없습니다.
비동기 메서드를 처리 하는 오류에 대 한 예제를 참조 하십시오. try-catch(C# 참조).
예제
Windows Forms 예제를 보여 줍니다 await 는 비동기 메서드의 WaitAsynchronouslyAsync.해당 메서드의 동작과 동작을 반대로 WaitSynchronously.없이 await 는 작업에 적용할 연산자 WaitSynchronously 의 사용에도 불구 하 고 동기적으로 실행는 async 한정자의 정의 및 호출을 Thread.Sleep 해당 본문에.
private async void button1_Click(object sender, EventArgs e)
{
// Call the method that runs asynchronously.
string result = await WaitAsynchronouslyAsync();
// Call the method that runs synchronously.
//string result = await WaitSynchronously ();
// Display the result.
textBox1.Text += result;
}
// The following method runs asynchronously. The UI thread is not
// blocked during the delay. You can move or resize the Form1 window
// while Task.Delay is running.
public async Task<string> WaitAsynchronouslyAsync()
{
await Task.Delay(10000);
return "Finished";
}
// The following method runs synchronously, despite the use of async.
// You cannot move or resize the Form1 window while Thread.Sleep
// is running because the UI thread is blocked.
public async Task<string> WaitSynchronously()
{
// Add a using directive for System.Threading.
Thread.Sleep(10000);
return "Finished";
}
참고 항목
작업
연습: Async 및 Await를 사용하여 웹에 액세스(C# 및 Visual Basic)