Share via


await(C# 참조)

await 연산자는 대기 작업이 완료될 때까지 메서드의 실행을 일시 중단하는 비동기 메서드에 작업을 적용합니다. 작업은 진행 중인 작업을 나타냅니다.

await가 사용되는 비동기 메서드는 async 키워드를 사용하여 수정해야 합니다. async 한정자를 사용해 정의되고 일반적으로 하나 이상의 await 식을 포함하는 이러한 메서드는 비동기 메서드로 참고됩니다.

참고

async 및 await 키워드는 Visual Studio 2012에서 도입되었습니다.비동기 프로그래밍에 대한 소개는 Async 및 Await를 사용한 비동기 프로그래밍(C# 및 Visual Basic)을 참조하십시오.

await 연산자가 일반적으로 적용되는 작업은 Task-Based Asynchronous Pattern을 구현하는 메서드에 대한 호출의 반환 값입니다. 예를 들어 Task 또는 Task 형식의 값이 있습니다.

다음 코드에서 HttpClient 메서드 GetByteArrayAsync는 Task<byte[]>, getContentsTask를 반환합니다. 작업은 작업이 완료되면 실제 바이트 배열을 생성하기 위한 약속입니다. await 연산자를 getContentsTask에 적용하여 getContentsTask가 완료될 때까지 SumPageSizesAsync에서 실행을 일시 중지합니다. 한편, 컨트롤은 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 문의 블록 또는 unsafe 컨텍스트에 포함될 수 없습니다.

예외

대부분의 비동기 메서드는 Task 또는 Task를 반환합니다. 반환된 작업의 속성에는 작업이 완료되었는지 여부, 비동기 메서드로 예외가 발생했는지 아니며 비동기 메서드가 취소되었는지 여부, 최종 결과 등 작업의 상태와 기록에 대한 정보가 포함됩니다. await 연산자는 이러한 속성에 액세스합니다.

예외의 원인이 되는 작업 반환 비동기 메서드를 기다릴 경우 await 연산자는 예외를 다시 throw합니다.

예외의 원인이 되는 작업 반환 비동기 메서드를 기다릴 경우 await 연산자는 OperationCanceledException을 다시 throw합니다.

오류 상태의 단일 작업은 여러 예외를 나타낼 수 있습니다. 예를 들어, 작업이 Task.WhenAll에 대한 호출의 결과일 수 있습니다. 이러한 작업을 기다릴 경우 대기 작업은 예외 중 하나만 다시 throw합니다. 그러나 어떤 예외가 다시 throw 되는지에 대해 예상할 수 없습니다.

비동기 메서드에서 오류 처리의 예를 보려면 try-catch(C# 참조)를 참조하십시오.

예제

다음 Windows Forms 예제는 WaitAsynchronouslyAsync 비동기 메서드에서의 await의 사용을 보여 줍니다. 해당 메서드의 동작을 WaitSynchronously의 동작과 비교합니다. 작업에 적용되는 await 연산자가 없으면 정의에서 async 한정자를 사용하고 본문에서 Thread.Sleep에 대한 호출을 사용하더라도 WaitSynchronously는 동기적으로 실행됩니다.

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)

참조

async(C# 참조)

개념

Async 및 Await를 사용한 비동기 프로그래밍(C# 및 Visual Basic)