async(C# 참조)async (C# Reference)

async 한정자를 사용하여 메서드, 람다 식 또는 무명 메서드를 비동기로 지정합니다.Use the async modifier to specify that a method, lambda expression, or anonymous method is asynchronous. 메서드 또는 식에 이 한정자를 사용하면 비동기 메서드라고 합니다.If you use this modifier on a method or expression, it's referred to as an async method. 다음 예제에서는 ExampleMethodAsync라는 비동기 메서드를 정의합니다.The following example defines an async method named ExampleMethodAsync:

public async Task<int> ExampleMethodAsync()  
{  
    // . . . .  
}  

비동기 프로그래밍이 처음이거나 비동기 메서드가 await 연산자를 사용하여 호출자의 스레드를 차단하지 않고 장기 실행 작업을 수행할 수 있는 방법을 잘 모르겠으면 async 및 await를 사용한 비동기 프로그래밍의 소개 내용을 참조하세요.If you're new to asynchronous programming or do not understand how an async method uses the await operator to do potentially long-running work without blocking the caller’s thread, read the introduction in Asynchronous Programming with async and await. 다음 코드는 비동기 메서드 안에 있으며 HttpClient.GetStringAsync 메서드를 호출합니다.The following code is found inside an async method and calls the HttpClient.GetStringAsync method:

string contents = await httpClient.GetStringAsync(requestUrl);  

비동기 메서드는 대기 중인 작업이 완료될 때까지 메서드가 일시 중단되는 지점인 첫 번째 await 식에 도달하기 전에는 동기적으로 실행됩니다.An async method runs synchronously until it reaches its first await expression, at which point the method is suspended until the awaited task is complete. 다음 단원의 예제에서처럼 그 동안에는 제어가 메서드 호출자에게 반환됩니다.In the meantime, control returns to the caller of the method, as the example in the next section shows.

async 키워드에서 수정하는 메서드에 await 식 또는 문이 없는 경우 해당 메서드가 동기적으로 실행됩니다.If the method that the async keyword modifies doesn't contain an await expression or statement, the method executes synchronously. await 문이 포함되지 않은 모든 비동기 메서드에서는 오류가 발생할 수 있으므로 컴파일러 경고가 나타납니다.A compiler warning alerts you to any async methods that don't contain await statements, because that situation might indicate an error. 컴파일러 경고(수준 1) CS4014를 참조하세요.See Compiler Warning (level 1) CS4014.

async 키워드는 메서드, 람다 식 또는 무명 메서드를 수정할 때만 키워드로 사용됩니다.The async keyword is contextual in that it's a keyword only when it modifies a method, a lambda expression, or an anonymous method. 다른 모든 컨텍스트에서는 식별자로 해석됩니다.In all other contexts, it's interpreted as an identifier.

Example

다음 예제에서는 비동기 이벤트 처리기, StartButton_Click, 비동기 메서드 및 ExampleMethodAsync 간의 제어 흐름과 구조를 보여 줍니다.The following example shows the structure and flow of control between an async event handler, StartButton_Click, and an async method, ExampleMethodAsync. 비동기 메서드의 결과는 웹 페이지의 문자 수입니다.The result from the async method is the number of characters of a web page. 이 코드는 Visual Studio에서 만든 WPF(Windows Presentation Foundation) 앱 또는 Windows 스토어 앱에 적합합니다. 앱을 설정하는 방법은 코드 주석을 참조하세요.The code is suitable for a Windows Presentation Foundation (WPF) app or Windows Store app that you create in Visual Studio; see the code comments for setting up the app.

Visual Studio에서 이 코드를 WPF(Windows Presentation Foundation) 앱 또는 Windows 스토어 앱으로 실행할 수 있습니다.You can run this code in Visual Studio as a Windows Presentation Foundation (WPF) app or a Windows Store app. StartButton이라는 Button 컨트롤과 ResultsTextBox라는 Textbox 컨트롤이 필요합니다.You need a Button control named StartButton and a Textbox control named ResultsTextBox. 다음과 같이 작성되도록 이름과 처리기를 설정해야 합니다.Remember to set the names and handler so that you have something like this:

<Button Content="Button" HorizontalAlignment="Left" Margin="88,77,0,0" VerticalAlignment="Top" Width="75"  
        Click="StartButton_Click" Name="StartButton"/>  
<TextBox HorizontalAlignment="Left" Height="137" Margin="88,140,0,0" TextWrapping="Wrap"   
         Text="&lt;Enter a URL&gt;" VerticalAlignment="Top" Width="310" Name="ResultsTextBox"/>  

코드를 WPF 앱으로 실행하려면To run the code as a WPF app:

  • 이 코드를 MainWindow.xaml.cs의 MainWindow 클래스에 붙여넣습니다.Paste this code into the MainWindow class in MainWindow.xaml.cs.
  • System.Net.Http에 대한 참조를 추가합니다.Add a reference to System.Net.Http.
  • System.Net.Http에 대한 using 지시문을 추가합니다.Add a using directive for System.Net.Http.

코드를 Windows 스토어 앱으로 실행하려면To run the code as a Windows Store app:

  • 이 코드를 MainPage.xaml.cs의 MainPage 클래스에 붙여넣습니다.Paste this code into the MainPage class in MainPage.xaml.cs.
  • System.Net.Http 및 System.Threading.Tasks에 대한 using 지시문을 추가합니다.Add using directives for System.Net.Http and System.Threading.Tasks.
private async void StartButton_Click(object sender, RoutedEventArgs e)
{
    // ExampleMethodAsync returns a Task<int>, which means that the method  
    // eventually produces an int result. However, ExampleMethodAsync returns  
    // the Task<int> value as soon as it reaches an await.  
    ResultsTextBox.Text += "\n";

    try
    {
        int length = await ExampleMethodAsync();
        // Note that you could put "await ExampleMethodAsync()" in the next line where  
        // "length" is, but due to when '+=' fetches the value of ResultsTextBox, you  
        // would not see the global side effect of ExampleMethodAsync setting the text.  
        ResultsTextBox.Text += String.Format("Length: {0:N0}\n", length);
    }
    catch (Exception)
    {
        // Process the exception if one occurs.  
    }
}

public async Task<int> ExampleMethodAsync()
{
    var httpClient = new HttpClient();
    int exampleInt = (await httpClient.GetStringAsync("http://msdn.microsoft.com")).Length;
    ResultsTextBox.Text += "Preparing to finish ExampleMethodAsync.\n";
    // After the following return statement, any method that's awaiting  
    // ExampleMethodAsync (in this case, StartButton_Click) can get the   
    // integer result.  
    return exampleInt;
}
// The example displays the following output:  
// Preparing to finish ExampleMethodAsync.  
// Length: 53292  

중요

작업 및 작업 완료를 기다리는 동안 실행되는 코드에 대한 자세한 내용은 async 및 await를 사용한 비동기 프로그래밍을 참조하세요.For more information about tasks and the code that executes while waiting for a task, see Asynchronous Programming with async and await. 비슷한 요소를 사용하는 전체 WPF 예제를 보려면 연습: Async 및 Await를 사용하여 웹에 액세스를 참조하세요.For a full WPF example that uses similar elements, see Walkthrough: Accessing the Web by Using Async and Await.

반환 형식Return Types

비동기 메서드의 반환 형식은 다음과 같을 수 있습니다.An async method can have the following return types:

  • Task
  • Task<TResult>
  • void.void. async void 메서드는 호출자가 await 해당 메서드를 사용할 수 없으며 성공적으로 완료 또는 오류 조건을 보고하는 다른 메커니즘을 구현해야 하기 때문에 이벤트 처리기 이외의 코드에 대해 일반적으로 사용되지 않습니다.async void methods are generally discouraged for code other than event handlers because callers cannot await those methods and must implement a different mechanism to report successful completion or error conditions.
  • C# 7.0부터 액세스 가능한 GetAwaiter 메서드가 있는 모든 형식.Starting with C# 7.0, any type that has an accessible GetAwaiter method. System.Threading.Tasks.ValueTask<TResult> 형식은 이러한 구현 중 하나입니다.The System.Threading.Tasks.ValueTask<TResult> type is one such implementation. NuGet 패키지 System.Threading.Tasks.Extensions를 추가하면 사용할 수 있습니다.It is available by adding the NuGet package System.Threading.Tasks.Extensions.

비동기 메서드는 모든 in, ref 또는 out 매개 변수를 선언할 수 없고 참조 반환 값을 가질 수도 없지만, 이러한 매개 변수가 있는 메서드를 호출할 수는 있습니다.The async method can't declare any in, ref or out parameters, nor can it have a reference return value, but it can call methods that have such parameters.

메서드의 return 문에서 TResult 형식의 피연산자를 지정할 경우 비동기 메서드의 반환 형식으로 Task<TResult>를 지정합니다.You specify Task<TResult> as the return type of an async method if the return statement of the method specifies an operand of type TResult. 메서드가 완료되었을 때 의미 있는 값이 반환되지 않을 경우 Task를 사용합니다.You use Task if no meaningful value is returned when the method is completed. 즉, 이 메서드를 호출하면 Task가 반환되지만 Task가 완료되면 await를 기다리는 모든 Task 식이 void가 됩니다.That is, a call to the method returns a Task, but when the Task is completed, any await expression that's awaiting the Task evaluates to void.

void 반환 형식은 주로 해당 반환 형식이 필요한 이벤트 처리기를 정의할 때 사용합니다.You use the void return type primarily to define event handlers, which require that return type. void 반환 비동기 메서드의 호출자는 기다릴 수 없으므로 메서드가 throw하는 예외를 catch할 수 없습니다.The caller of a void-returning async method can't await it and can't catch exceptions that the method throws.

C# 7.0부터 GetAwaiter 메서드가 있는 다른 형식(일반적으로 값 형식)을 반환하여 성능이 중요한 코드 섹션에서 메모리 할당을 최소화합니다.Starting with C# 7.0, you return another type, typically a value type, that has a GetAwaiter method to minimize memory allocations in performance-critical sections of code.

자세한 내용과 예제는 비동기 반환 형식을 참조하세요.For more information and examples, see Async Return Types.

참고 항목See also