Async 및 Wait를 사용한 비동기 프로그래밍 (Visual Basic)Asynchronous programming with Async and Await (Visual Basic)

비동기 프로그래밍을 사용하여 성능 병목 현상을 방지하고 애플리케이션의 전체적인 응답성을 향상할 수 있습니다.You can avoid performance bottlenecks and enhance the overall responsiveness of your application by using asynchronous programming. 그러나 비동기 애플리케이션을 쓰는 일반적인 기술이 복잡하여 해당 애플리케이션을 쓰고, 디버깅하고, 유지 관리하기 어려울 수 있습니다.However, traditional techniques for writing asynchronous applications can be complicated, making them difficult to write, debug, and maintain.

Visual Studio 2012에는 Windows 런타임 뿐 아니라 .NET Framework 4.5 이상의 비동기 지원을 활용하는 간단한 비동기 프로그래밍 접근 방법이 도입되었습니다.Visual Studio 2012 introduced a simplified approach, async programming, that leverages asynchronous support in the .NET Framework 4.5 and higher as well as in the Windows Runtime. 컴파일러는 개발자가 하던 어려운 작업을 수행하고, 애플리케이션은 동기 코드와 비슷한 논리 구조를 유지합니다.The compiler does the difficult work that the developer used to do, and your application retains a logical structure that resembles synchronous code. 따라서 약간의 노력만으로도 비동기 프로그래밍의 모든 장점을 누릴 수 있습니다.As a result, you get all the advantages of asynchronous programming with a fraction of the effort.

이 항목에서는 비동기 프로그래밍을 사용하는 시기 및 방법에 대한 개요를 제공하고 특정 세부 정보 및 예제가 포함된 지원 항목에 대한 링크가 포함되어 있습니다.This topic provides an overview of when and how to use async programming and includes links to support topics that contain details and examples.

반응성을 향상시키는 비동기Async improves responsiveness

비동기는 애플리케이션이 웹에 액세스하는 경우와 같이 차단 가능성이 있는 작업에 반드시 필요합니다.Asynchrony is essential for activities that are potentially blocking, such as when your application accesses the web. 웹 리소스에 대한 액세스 속도가 느리거나 지연됩니다.Access to a web resource sometimes is slow or delayed. 동기 프로세스 안에서 이러한 활동이 차단되면 전체 애플리케이션이 기다려야 합니다.If such an activity is blocked within a synchronous process, the entire application must wait. 비동기 프로세스에서 애플리케이션은 잠재적인 차단 작업이 완료될 때까지 웹 리소스에 의존하지 않는 다른 작업을 계속 수행할 수 있습니다.In an asynchronous process, the application can continue with other work that doesn't depend on the web resource until the potentially blocking task finishes.

다음 표에는 비동기 프로그래밍으로 응답성이 향상되는 일반적인 영역이 나와 있습니다.The following table shows typical areas where asynchronous programming improves responsiveness. .NET Framework 4.5 및 Windows 런타임에서 나열된 API에는 비동기 프로그래밍을 지원하는 메서드가 포함되어 있습니다.The listed APIs from the .NET Framework 4.5 and the Windows Runtime contain methods that support async programming.

응용 프로그램 영역Application area 비동기 메서드를 포함하는 API 지원Supporting APIs that contain async methods
웹 액세스Web access HttpClient, SyndicationClientHttpClient, SyndicationClient
파일 작업Working with files StorageFile, StreamWriter, StreamReader, XmlReaderStorageFile, StreamWriter, StreamReader, XmlReader
이미지 작업Working with images MediaCapture에서 BitmapEncoder에서 BitmapDecoderMediaCapture, BitmapEncoder, BitmapDecoder
WCF 프로그래밍WCF programming 동기 및 비동기 작업Synchronous and Asynchronous Operations

모든 UI 관련 작업이 대체로 스레드 한 개를 공유하므로 비동기는 특히 UI 스레드에 액세스하는 애플리케이션의 변수를 증명합니다.Asynchrony proves especially valuable for applications that access the UI thread because all UI-related activity usually shares one thread. 동기 애플리케이션에서 임의의 프로세스가 차단되면 모든 프로세스가 차단됩니다.If any process is blocked in a synchronous application, all are blocked. 애플리케이션이 응답을 중지하면 기다리지 않고 애플리케이션이 실패한 것으로 결론을 내릴 것입니다.Your application stops responding, and you might conclude that it has failed when instead it's just waiting.

비동기 메서드를 사용하면 애플리케이션이 UI에 계속 응답합니다.When you use asynchronous methods, the application continues to respond to the UI. 예를 들어 창의 크기를 조정하거나 최소화할 수 있습니다. 또는 애플리케이션이 완료될 때까지 기다리고 싶지 않다면 애플리케이션을 종료할 수 있습니다.You can resize or minimize a window, for example, or you can close the application if you don't want to wait for it to finish.

비동기 기반 접근 방식을 사용하면 비동기 작업을 디자인할 때 선택할 수 있는 옵션 목록에 자동 전송과 동일한 기능을 추가할 수 있습니다.The async-based approach adds the equivalent of an automatic transmission to the list of options that you can choose from when designing asynchronous operations. 즉, 더 적은 개발자의 노력으로 기존 비동기 프로그래밍의 이점을 모두 활용할 수 있습니다.That is, you get all the benefits of traditional asynchronous programming but with much less effort from the developer.

작성이 간편한 비동기 메서드Async methods are easier to write

Visual Basic의 AsyncAwait 키워드는 비동기 프로그래밍의 핵심입니다.The Async and Await keywords in Visual Basic are the heart of async programming. 이 키워드 두 개를 사용하면 .NET Framework 또는 Windows 런타임의 리소스를 사용하여 동기 메서드를 만드는 것만큼 쉽게 비동기 메서드를 만들 수 있습니다.By using those two keywords, you can use resources in the .NET Framework or the Windows Runtime to create an asynchronous method almost as easily as you create a synchronous method. AsyncAwait를 사용하여 정의하는 비동기 메서드를 비동기 메서드라고 합니다.Asynchronous methods that you define by using Async and Await are referred to as async methods.

다음 예제에서는 비동기 메서드를 보여줍니다.The following example shows an async method. 코드의 거의 모든 내용이 익숙할 것입니다.Almost everything in the code should look completely familiar to you. 주석은 비동기를 만들 때 추가하는 기능을 호출합니다.The comments call out the features that you add to create the asynchrony.

이 항목의 마지막에 완전한 WPF(Windows Presentation Foundation) 예제 파일이 있으며, Async 샘플: "Async 및 Await를 사용하는 비동기 프로그래밍"의 예제에서 샘플을 다운로드할 수 있습니다.You can find a complete Windows Presentation Foundation (WPF) example file at the end of this topic, and you can download the sample from Async Sample: Example from "Asynchronous Programming with Async and Await".

' Three things to note about writing an Async Function:
'  - The function has an Async modifier.
'  - Its return type is Task or Task(Of T). (See "Return Types" section.)
'  - As a matter of convention, its name ends in "Async".
Async Function AccessTheWebAsync() As Task(Of Integer)
    Using client As New HttpClient()
        ' Call and await separately.
        '  - AccessTheWebAsync can do other things while GetStringAsync is also running.
        '  - getStringTask stores the task we get from the call to GetStringAsync.
        '  - Task(Of String) means it is a task which returns a String when it is done.
        Dim getStringTask As Task(Of String) =
            client.GetStringAsync("https://docs.microsoft.com/dotnet")
        ' You can do other work here that doesn't rely on the string from GetStringAsync.
        DoIndependentWork()
        ' The Await operator suspends AccessTheWebAsync.
        '  - AccessTheWebAsync does not 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.
        Dim urlContents As String = Await getStringTask
        ' The Return statement specifies an Integer result.
        ' A method which awaits AccessTheWebAsync receives the Length value.
        Return urlContents.Length

    End Using

End Function

AccessTheWebAsyncGetStringAsync 호출과 해당 완료 대기 사이에 수행할 수 있는 작업이 없는 경우 다음 단일 문을 호출하고 대기하여 코드를 단순화할 수 있습니다.If AccessTheWebAsync doesn't have any work that it can do between calling GetStringAsync and awaiting its completion, you can simplify your code by calling and awaiting in the following single statement.

Dim urlContents As String = Await client.GetStringAsync()

이전 예제가 비동기 메서드인 이유는 다음과 같은 특성 때문입니다.The following characteristics summarize what makes the previous example an async method:

  • 메서드 시그니처에 Async 한정자가 포함됩니다.The method signature includes an Async modifier.

  • 비동기 메서드의 이름은 규칙에 따라 "Async" 접미사로 끝납니다.The name of an async method, by convention, ends with an "Async" suffix.

  • 반환 형식은 다음 형식 중 하나입니다.The return type is one of the following types:

    • 메서드에 연산자 형식이 TResult 인 return 문이 있는 경우 의 작업 (tresult) 입니다.Task(Of TResult) if your method has a return statement in which the operand has type TResult.
    • 메서드에 반환 문이 포함되지 않았거나 피연산자가 없는 반환 문이 포함된 경우 Task입니다.Task if your method has no return statement or has a return statement with no operand.
    • 비동기 이벤트 처리기를 작성하는 경우 Sub입니다.Sub if you're writing an async event handler.

    자세한 내용은 이 항목 뒷부분의 "반환 형식 및 매개 변수"를 참조하세요.For more information, see "Return Types and Parameters" later in this topic.

  • 메서드는 일반적으로 비동기 작업이 완료될 때까지 메서드가 계속될 수 없는 지점을 표시하는 하나 이상의 대기 표현을 포함하고 있습니다.The method usually includes at least one await expression, which marks a point where the method can't continue until the awaited asynchronous operation is complete. 한편, 메서드가 일시 중단되고 컨트롤이 메서드의 호출자로 반환됩니다.In the meantime, the method is suspended, and control returns to the method's caller. 이 항목의 다음 단원은 일시 중단 지점에서 발생하는 상황을 보여줍니다.The next section of this topic illustrates what happens at the suspension point.

비동기 메서드에서는 제공된 키워드 및 형식을 사용해서 수행하려는 작업을 나타내고, 컴파일러는 일시 중단된 메서드에서 컨트롤이 대기 지점으로 반환될 때 수행되어야 하는 항목을 추적하는 등의 나머지 작업을 수행합니다.In async methods, you use the provided keywords and types to indicate what you want to do, and the compiler does the rest, including keeping track of what must happen when control returns to an await point in a suspended method. 루프 및 예외 처리와 같은 일부 루틴 프로세스는 기존의 비동기 코드에서 처리하기 어려울 수 있습니다.Some routine processes, such as loops and exception handling, can be difficult to handle in traditional asynchronous code. 비동기 메서드에서는 동기 솔루션에서와 같이 필요한 만큼 이러한 요소를 작성하여 문제를 해결합니다.In an async method, you write these elements much as you would in a synchronous solution, and the problem is solved.

이전 버전의 .NET Framework의 비동기에 대한 자세한 내용은 TPL 및 일반적인 .NET Framework 비동기 프로그래밍을 참조하세요.For more information about asynchrony in previous versions of the .NET Framework, see TPL and Traditional .NET Framework Asynchronous Programming.

비동기 메서드에서 수행 되는 작업What happens in an Async method

비동기 프로그래밍을 이해하는 데 있어 가장 중요한 점은 메서드에서 메서드로 제어 흐름을 이동하는 방법입니다.The most important thing to understand in asynchronous programming is how the control flow moves from method to method. 다음 다이어그램에서 과정을 안내합니다.The following diagram leads you through the process:

비동기 프로그램 추적을 보여 주는 다이어그램입니다.

다이어그램의 숫자는 다음 단계에 해당 합니다.The numbers in the diagram correspond to the following steps:

  1. 이벤트 처리기가 호출되어 AccessTheWebAsync 비동기 메서드를 기다립니다.An event handler calls and awaits the AccessTheWebAsync async method.

  2. AccessTheWebAsyncHttpClient 인스턴스를 만들고 GetStringAsync 비동기 메서드를 호출하여 웹 사이트의 내용을 문자열로 다운로드합니다.AccessTheWebAsync creates an HttpClient instance and calls the GetStringAsync asynchronous method to download the contents of a website as a string.

  3. GetStringAsync에서 특정 작업이 발생하여 진행이 일시 중단됩니다.Something happens in GetStringAsync that suspends its progress. 웹 사이트에서 다운로드 또는 다른 차단 작업을 수행할 때까지 기다려야 할 수 있습니다.Perhaps it must wait for a website to download or some other blocking activity. 리소스를 차단하지 않기 위해 GetStringAsync는 해당 호출자인 AccessTheWebAsync에 제어 권한을 양도합니다.To avoid blocking resources, GetStringAsync yields control to its caller, AccessTheWebAsync.

    GetStringAsync는 TResult가 문자열인 작업 (tresult) 을 반환 하 AccessTheWebAsync getStringTask 변수에 작업을 할당 합니다.GetStringAsync returns a Task(Of TResult) where TResult is a string, and AccessTheWebAsync assigns the task to the getStringTask variable. 이 작업은 작업이 완료될 때 실제 문자열 값을 생성하기 위한 코드와 함께 GetStringAsync를 호출하는 지속적인 프로세스를 나타냅니다.The task represents the ongoing process for the call to GetStringAsync, with a commitment to produce an actual string value when the work is complete.

  4. getStringTask가 아직 대기되지 않았으므로 AccessTheWebAsyncGetStringAsync의 최종 결과에 무관한 다른 작업을 계속할 수 있습니다.Because getStringTask hasn't been awaited yet, AccessTheWebAsync can continue with other work that doesn't depend on the final result from GetStringAsync. 이 작업은 동기 메서드 DoIndependentWork를 호출하여 나타냅니다.That work is represented by a call to the synchronous method DoIndependentWork.

  5. DoIndependentWork는 작업을 수행하고 호출자에게 반환하는 동기 메서드입니다.DoIndependentWork is a synchronous method that does its work and returns to its caller.

  6. AccessTheWebAsyncgetStringTask 결과 없이 수행할 수 있는 작업이 없습니다.AccessTheWebAsync has run out of work that it can do without a result from getStringTask. 다음으로 AccessTheWebAsync는 다운로드한 문자열의 길이를 계산하여 반환하려 하지만, 메서드가 문자열을 확인할 때까지 해당 값을 계산할 수 없습니다.AccessTheWebAsync next wants to calculate and return the length of the downloaded string, but the method can't calculate that value until the method has the string.

    따라서 AccessTheWebAsync는 await 연산자를 사용해서 해당 프로세스를 일시 중단하고 AccessTheWebAsync를 호출한 메서드에 제어 권한을 양도합니다.Therefore, AccessTheWebAsync uses an await operator to suspend its progress and to yield control to the method that called AccessTheWebAsync. AccessTheWebAsyncTask(Of Integer)를 호출자에게 반환합니다.AccessTheWebAsync returns a Task(Of Integer) to the caller. 작업은 다운로드한 문자열의 길이인 정수 결과를 만든다는 약속을 나타냅니다.The task represents a promise to produce an integer result that's the length of the downloaded string.

    참고

    GetStringAsync가 대기하기 전에 getStringTask(및 AccessTheWebAsync)가 완료되면 AccessTheWebAsync에 컨트롤이 유지됩니다.If GetStringAsync (and therefore getStringTask) is complete before AccessTheWebAsync awaits it, control remains in AccessTheWebAsync. 일시 중단 및 AccessTheWebAsync의 반환 비용은 호출된 비동기 프로세스(getStringTask)가 이미 완료되었고 AccessTheWebSync가 최종 결과를 기다릴 필요가 없다면 낭비됩니다.The expense of suspending and then returning to AccessTheWebAsync would be wasted if the called asynchronous process (getStringTask) has already completed and AccessTheWebSync doesn't have to wait for the final result.

    호출자(이 예제의 이벤트 처리기) 내에서 처리 패턴이 계속됩니다.Inside the caller (the event handler in this example), the processing pattern continues. 호출자가 해당 결과를 기다리거나 즉시 기다리기 전에 AccessTheWebAsync에서 결과에 의존하지 않는 다른 작업을 수행할 수 있습니다.The caller might do other work that doesn't depend on the result from AccessTheWebAsync before awaiting that result, or the caller might await immediately. AccessTheWebAsync에 대한 이벤트가 대기 중이며 AccessTheWebAsyncGetStringAsync를 대기 중입니다.The event handler is waiting for AccessTheWebAsync, and AccessTheWebAsync is waiting for GetStringAsync.

  7. GetStringAsync가 완료되고 문자열 결과를 생성합니다.GetStringAsync completes and produces a string result. GetStringAsync를 호출할 경우 문자열 결과가 예상대로 반환되지 않습니다.The string result isn't returned by the call to GetStringAsync in the way that you might expect. (3단계에서 메서드가 이미 반환된 것을 기억하십시오.) 대신, 문자열 결과가 getStringTask 메서드의 완료를 나타내는 작업에 저장됩니다.(Remember that the method already returned a task in step 3.) Instead, the string result is stored in the task that represents the completion of the method, getStringTask. await 연산자가 getStringTask에서 결과를 검색합니다.The await operator retrieves the result from getStringTask. 할당 문은 검색된 결과를 urlContents에 할당합니다.The assignment statement assigns the retrieved result to urlContents.

  8. AccessTheWebAsync에 문자열 결과가 있는 경우 메서드가 문자열 길이를 계산할 수 있습니다.When AccessTheWebAsync has the string result, the method can calculate the length of the string. 그런 다음 AccessTheWebAsync 작업도 완료되고 대기 이벤트 처리기를 다시 시작할 수 있습니다.Then the work of AccessTheWebAsync is also complete, and the waiting event handler can resume. 이 항목 뒷부분의 전체 예에서는 이벤트 처리기가 길이 결과 값을 검색하고 출력하는지 확인할 수 있습니다.In the full example at the end of the topic, you can confirm that the event handler retrieves and prints the value of the length result.

비동기 프로그래밍을 처음 접하는 사용자인 경우 동기 동작과 비동기 동작의 차이점을 살펴보세요.If you are new to asynchronous programming, take a minute to consider the difference between synchronous and asynchronous behavior. 비동기 메서드는 작업이 완료될 때 반환되지만(5단계) 비동기 메서드는 작업이 일시 중단될 때 반환됩니다.A synchronous method returns when its work is complete (step 5), but an async method returns a task value when its work is suspended (steps 3 and 6). 비동기 메서드가 해당 작업을 완료하면 작업이 완료된 것으로 표시되고 결과가 있을 경우 작업에 저장됩니다.When the async method eventually completes its work, the task is marked as completed and the result, if any, is stored in the task.

제어 흐름에 대한 자세한 내용은 비동기 프로그램의 제어 흐름(Visual Basic)을 참조하세요.For more information about control flow, see Control Flow in Async Programs (Visual Basic).

API Async 메서드API Async Methods

GetStringAsync와 같이 비동기 프로그래밍을 지원하는 메서드를 어디에서 검색해야 할지 궁금했을 것입니다.You might be wondering where to find methods such as GetStringAsync that support async programming. .NET Framework 4.5 이상에는 AsyncAwait에서 작동 하는 많은 멤버가 포함 되어 있습니다.The .NET Framework 4.5 or higher contains many members that work with Async and Await. 멤버 이름에 연결 된 "Async" 접미사로 이러한 멤버와 Task 또는 태스크 (TResult)의 반환 형식을 인식할 수 있습니다.You can recognize these members by the "Async" suffix that's attached to the member name and a return type of Task or Task(Of TResult). 예를 들어, System.IO.Stream 클래스는 동기 메서드인 CopyTo, ReadWrite와 함께 CopyToAsync, ReadAsyncWriteAsync와 같은 메서드를 포함합니다.For example, the System.IO.Stream class contains methods such as CopyToAsync, ReadAsync, and WriteAsync alongside the synchronous methods CopyTo, Read, and Write.

Windows 런타임에는 Windows 앱에서 AsyncAwait와 함께 사용할 수 있는 많은 메서드도 포함되어 있습니다.The Windows Runtime also contains many methods that you can use with Async and Await in Windows apps. 자세한 내용 및 예제 메서드를 보려면 또는 Visual Basic에서 C# 비동기 api 호출, 비동기 프로그래밍 (Windows 런타임 앱)제한 any: .NET Framework와 Windows 런타임 간 브리징을 참조 하십시오.For more information and example methods, see Call asynchronous APIs in C# or Visual Basic, Asynchronous programming (Windows Runtime apps), and WhenAny: Bridging between the .NET Framework and the Windows Runtime.

스레드Threads

비동기 메서드는 비차단 작업으로 의도되었습니다.Async methods are intended to be non-blocking operations. 비동기 메서드의 Await 식은 대기한 작업이 실행되는 동안 현재 스레드를 차단하지 않습니다.An Await expression in an async method doesn't block the current thread while the awaited task is running. 대신에 이 식은 메서드의 나머지를 연속으로 등록하고 제어 기능을 비동기 메서드 호출자에게 반환합니다.Instead, the expression signs up the rest of the method as a continuation and returns control to the caller of the async method.

AsyncAwait 키워드로 인해 추가 스레드가 생성되지 않습니다.The Async and Await keywords don't cause additional threads to be created. 비동기 메서드는 자체 스레드에서 실행 되지 않으므로 비동기 메서드는 다중 스레딩을 필요로 하지 않습니다.Async methods don't require multi-threading because an async method doesn't run on its own thread. 메서드는 현재 동기화 컨텍스트에서 실행되고 메서드가 활성화된 경우에만 스레드에서 시간을 사용합니다.The method runs on the current synchronization context and uses time on the thread only when the method is active. Task.Run을 사용하여 CPU 바인딩 작업을 백그라운드 스레드로 이동할 수 있지만 백그라운드 스레드는 결과를 사용할 수 있을 때까지 기다리는 프로세스를 도와주지 않습니다.You can use Task.Run to move CPU-bound work to a background thread, but a background thread doesn't help with a process that's just waiting for results to become available.

비동기 프로그래밍에 대한 비동기 기반 접근 방법은 거의 모든 경우에 기존 방법보다 선호됩니다.The async-based approach to asynchronous programming is preferable to existing approaches in almost every case. 특히이 접근 방식은 코드가 더 간단 하 고 경합 상태를 방지할 필요가 없기 때문에 i/o 바인딩된 작업에 대 한 BackgroundWorker 보다 좋습니다.In particular, this approach is better than BackgroundWorker for I/O-bound operations because the code is simpler and you don't have to guard against race conditions. 비동기 프로그래밍은 코드 실행에 대한 조합 세부 정보를 Task.Run이 스레드 풀로 변환하는 작업과 구분하기 때문에 BackgroundWorker을 함께 사용하는 비동기 프로그래밍은 CPU 바인딩 작업을 위한 Task.Run보다 효과가 뛰어납니다.In combination with Task.Run, async programming is better than BackgroundWorker for CPU-bound operations because async programming separates the coordination details of running your code from the work that Task.Run transfers to the threadpool.

Async 및 AwaitAsync and Await

Async 한정자를 사용해서 메서드를 비동기 메서드로 지정하면 다음 두 기능이 활성화됩니다.If you specify that a method is an async method by using an Async modifier, you enable the following two capabilities.

  • 표시된 비동기 메서드는 Await를 사용하여 일시 중단 지점을 지정할 수 있습니다.The marked async method can use Await to designate suspension points. Await 연산자는 비동기 프로세스가 완료될 때까지 비동기 메서드가 해당 지점을 계속할 수 없다고 지시합니다.The await operator tells the compiler that the async method can't continue past that point until the awaited asynchronous process is complete. 한편, 컨트롤이 비동기 메서드의 호출자로 반환됩니다.In the meantime, control returns to the caller of the async method.

    Await 식에서 비동기 메서드를 일시 중단하더라도 메서드가 종료되지는 않으며 Finally 블록이 실행되지 않습니다.The suspension of an async method at an Await expression doesn't constitute an exit from the method, and Finally blocks don't run.

  • 표시된 비동기 메서드는 이 메서드를 호출한 다른 메서드에 의해 대기할 수 있습니다.The marked async method can itself be awaited by methods that call it.

비동기 메서드는 일반적으로 Await 연산자를 하나 이상 가지고 있지만, Await 식이 없는 경우 컴파일러 오류가 발생하지는 않습니다.An async method typically contains one or more occurrences of an Await operator, but the absence of Await expressions doesn't cause a compiler error. 비동기 메서드에서 Await 연산자를 사용하여 일시 중단 시점을 표시하지 않는 경우 메서드가 Async 한정자에 상관없이 동기 메서드가 실행되는 방식으로 실행됩니다.If an async method doesn't use an Await operator to mark a suspension point, the method executes as a synchronous method does, despite the Async modifier. 컴파일러는 해당 메서드에 대해 경고를 표시합니다.The compiler issues a warning for such methods.

AsyncAwait은 상황별 키워드입니다.Async and Await are contextual keywords. 자세한 내용과 예제는 다음 항목을 참조하세요.For more information and examples, see the following topics:

반환 형식 및 매개 변수Return types and parameters

.NET Framework 프로그래밍에서 비동기 메서드는 일반적으로 Task 또는 작업 (TResult의 경우)을 반환 합니다.In .NET Framework programming, an async method typically returns a Task or a Task(Of TResult). 비동기 메서드 내에서 Await 연산자는 호출에서 다른 비동기 메서드로 전환되는 작업에 적용됩니다.Inside an async method, an Await operator is applied to a task that's returned from a call to another async method.

메서드에 TResult형식의 피연산자를 지정 하는 return 문이 포함 되어 있는 경우에는 작업 (TResult) 을 반환 형식으로 지정 합니다.You specify Task(Of TResult) as the return type if the method contains a Return statement that specifies an operand of type TResult.

메서드에 return 문이 없거나 피연산자를 반환하지 않는 return 문이 있을 경우 반환 형식으로 Task를 사용합니다.You use Task as the return type if the method has no return statement or has a return statement that doesn't return an operand.

다음 예제에서는 작업 (TResult) 또는 Task을 반환 하는 메서드를 선언 하 고 호출 하는 방법을 보여 줍니다.The following example shows how you declare and call a method that returns a Task(Of TResult) or a Task:

' Signature specifies Task(Of Integer)
Async Function TaskOfTResult_MethodAsync() As Task(Of Integer)

    Dim hours As Integer
    ' . . .
    ' Return statement specifies an integer result.
    Return hours
End Function

' Calls to TaskOfTResult_MethodAsync
Dim returnedTaskTResult As Task(Of Integer) = TaskOfTResult_MethodAsync()
Dim intResult As Integer = Await returnedTaskTResult
' or, in a single statement
Dim intResult As Integer = Await TaskOfTResult_MethodAsync()

' Signature specifies Task
Async Function Task_MethodAsync() As Task

    ' . . .
    ' The method has no return statement.
End Function

' Calls to Task_MethodAsync
Task returnedTask = Task_MethodAsync()
Await returnedTask
' or, in a single statement
Await Task_MethodAsync()

반환된 각 작업은 진행 중인 작업을 나타냅니다.Each returned task represents ongoing work. 작업은 비동기 프로세스 상태에 대한 정보를 캡슐화하며, 결과적으로 프로세스의 최종 결과 또는 성공하지 못한 경우 프로세스가 발생시키는 예외에 대한 정보를 캡슐화합니다.A task encapsulates information about the state of the asynchronous process and, eventually, either the final result from the process or the exception that the process raises if it doesn't succeed.

또한 비동기 메서드는 Sub 메서드일 수도 있습니다.An async method can also be a Sub method. 이 반환 형식은 기본적으로 반환 형식이 필요할 때 이벤트 처리기를 정의하는 데 사용합니다.This return type is used primarily to define event handlers, where a return type is required. 비동기 이벤트 처리기는 비동기 프로그램의 시작점 역할을 하는 경우가 많습니다.Async event handlers often serve as the starting point for async programs.

Sub 프로시저인 비동기 메서드는 대기 수 없으며 호출자는 메서드가 throw 하는 예외를 catch 할 수 없습니다.An async method that's a Sub procedure can't be awaited, and the caller can't catch any exceptions that the method throws.

비동기 메서드는 모든 ByRef 매개 변수를 선언할 수 없지만, 이러한 매개 변수가 있는 메서드를 호출할 수는 있습니다.An async method can't declare ByRef parameters, but the method can call methods that have such parameters.

자세한 내용과 예제는 비동기 반환 형식(Visual Basic)을 참조하세요.For more information and examples, see Async Return Types (Visual Basic). 비동기 메서드에서 예외를 catch하는 방법에 대한 자세한 내용은 Try...Catch...Finally 문을 참조하세요.For more information about how to catch exceptions in async methods, see Try...Catch...Finally Statement.

Windows 런타임 프로그래밍의 비동기 API에는 작업과 유사한 다음 반환 형식 중 하나가 있습니다.Asynchronous APIs in Windows Runtime programming have one of the following return types, which are similar to tasks:

자세한 내용 및 예제는 또는 Visual Basic에서 C# 비동기 api 호출을 참조 하세요.For more information and an example, see Call asynchronous APIs in C# or Visual Basic.

명명 규칙Naming convention

규칙에 따라 Async 한정자가 있는 메서드 이름에 "Async"를 추가합니다.By convention, you append "Async" to the names of methods that have an Async modifier.

여기서 이벤트, 기본 클래스 또는 인터페이스 계약으로 다른 이름을 제안하는 규칙을 무시할 수 있습니다.You can ignore the convention where an event, base class, or interface contract suggests a different name. 예를 들어, Button1_Click과 같은 공용 이벤트 처리기의 이름을 변경할 수 없습니다.For example, you shouldn't rename common event handlers, such as Button1_Click.

관련 항목 및 샘플(Visual Studio)Related topics and samples (Visual Studio)

제목Title 설명Description 예제Sample
연습: Async 및 Await를 사용하여 웹에 액세스(Visual Basic)Walkthrough: Accessing the Web by Using Async and Await (Visual Basic) 동기 WPF 솔루션을 비동기 WPF 솔루션으로 변환하는 방법을 보여줍니다.Shows how to convert a synchronous WPF solution to an asynchronous WPF solution. 이 애플리케이션은 일련의 웹 사이트를 다운로드합니다.The application downloads a series of websites. Async 샘플: 웹 연습에 액세스Async Sample: Accessing the Web Walkthrough
방법: Task.WhenAll을 사용하여 비동기 연습 확장(Visual Basic)How to: Extend the Async Walkthrough by Using Task.WhenAll (Visual Basic) 이전 연습에 Task.WhenAll을 추가합니다.Adds Task.WhenAll to the previous walkthrough. WhenAll을 사용하면 모든 다운로드가 동시에 시작됩니다.The use of WhenAll starts all the downloads at the same time.
방법: Async 및 Await를 사용하여 병렬로 여러 웹 요청 만들기(Visual Basic)How to: Make Multiple Web Requests in Parallel by Using Async and Await (Visual Basic) 동시에 여러 작업을 시작하는 방법을 보여줍니다.Demonstrates how to start several tasks at the same time. Async 샘플: 여러 웹 요청을 병렬로 만들기Async Sample: Make Multiple Web Requests in Parallel
비동기 반환 형식(Visual Basic)Async Return Types (Visual Basic) 비동기 메서드에서 반환할 수 있는 형식을 설명하고 각 형식이 언제 적절한가를 설명합니다.Illustrates the types that async methods can return and explains when each type is appropriate.
비동기 프로그램의 제어 흐름(Visual Basic)Control Flow in Async Programs (Visual Basic) 비동기 프로그램에서 연속적 await 표현을 통한 컨트롤의 흐름을 자세히 추적합니다.Traces in detail the flow of control through a succession of await expressions in an asynchronous program. Async 샘플: 비동기 프로그램의 제어 흐름Async Sample: Control Flow in Async Programs
Async 애플리케이션 미세 조정(Visual Basic)Fine-Tuning Your Async Application (Visual Basic) 비동기 솔루션에 다음과 같은 기능을 추가하는 방법을 보여줍니다.Shows how to add the following functionality to your async solution:

- 비동기 작업 또는 작업 목록 취소(Visual Basic)- Cancel an Async Task or a List of Tasks (Visual Basic)
- 일정 기간 이후 비동기 작업 취소(Visual Basic)- Cancel Async Tasks after a Period of Time (Visual Basic)
- 비동기 작업 하나가 완료되면 남은 비동기 작업 취소(Visual Basic)- Cancel Remaining Async Tasks after One Is Complete (Visual Basic)
- 비동기 작업을 여러 개 시작하고 완료될 때마다 처리(Visual Basic)- Start Multiple Async Tasks and Process Them As They Complete (Visual Basic)
Async 샘플: 애플리케이션 미세 조정Async Sample: Fine Tuning Your Application
비동기 응용 프로그램에서 재진입 처리(Visual Basic)Handling Reentrancy in Async Apps (Visual Basic) 비동기 작업이 실행되는 동안 현재 비동기 작업을 다시 시작하는 경우 처리 방법을 보여줍니다.Shows how to handle cases in which an active asynchronous operation is restarted while it's running.
WhenAny: .NET Framework와 Windows 런타임 간 브리징WhenAny: Bridging between the .NET Framework and the Windows Runtime Windows 런타임 메서드에 WhenAny를 사용할 수 있도록 .NET Framework의 작업 형식과 Windows 런타임의 IAsyncOperations를 연결하는 방법을 보여 줍니다.Shows how to bridge between Task types in the .NET Framework and IAsyncOperations in the Windows Runtime so that you can use WhenAny with a Windows Runtime method. Async 샘플: .NET 및 Windows 런타임 간 연결(AsTask 및 WhenAny)Async Sample: Bridging between .NET and Windows Runtime (AsTask and WhenAny)
비동기 취소: .NET Framework와 Windows 런타임 간 브리징Async Cancellation: Bridging between the .NET Framework and the Windows Runtime Windows 런타임 메서드에 CancellationTokenSource를 사용할 수 있도록 .NET Framework의 작업 형식과 Windows 런타임의 IAsyncOperations를 연결하는 방법을 보여 줍니다.Shows how to bridge between Task types in the .NET Framework and IAsyncOperations in the Windows Runtime so that you can use CancellationTokenSource with a Windows Runtime method. Async 샘플: .NET 및 Windows 런타임 간 연결(AsTask & 취소)Async Sample: Bridging between .NET and Windows Runtime (AsTask & Cancellation)
파일 액세스에 Async 사용(Visual Basic)Using Async for File Access (Visual Basic) async 및 await를 사용하여 파일에 액세스하는 이점을 나열하고 보여줍니다.Lists and demonstrates the benefits of using async and await to access files.
TAP(작업 기반 비동기 패턴)Task-based Asynchronous Pattern (TAP) .NET Framework의 새로운 비동기 패턴에 대해 설명합니다.Describes a new pattern for asynchrony in the .NET Framework. 패턴은 Task작업 (TResult) 형식을 기반으로 합니다.The pattern is based on the Task and Task(Of TResult) types.
비동기 Channel 9 비디오Async Videos on Channel 9 비동기 프로그래밍에 대한 다양한 비디오로 연결되는 링크를 제공합니다.Provides links to a variety of videos about async programming.

전체 예제Complete Example

다음 코드는 이 항목에서 설명하는 WPF(Windows Presentation Foundation) 애플리케이션의 MainWindow.xaml.vb 파일입니다.The following code is the MainWindow.xaml.vb file from the Windows Presentation Foundation (WPF) application that this topic discusses. Async 샘플: "Async 및 Await를 사용하는 비동기 프로그래밍"의 예제에서 샘플을 다운로드할 수 있습니다.You can download the sample from Async Sample: Example from "Asynchronous Programming with Async and Await".


Imports System.Net.Http

' Example that demonstrates Asynchronous Progamming with Async and Await.
' It uses HttpClient.GetStringAsync to download the contents of a website.
' Sample Output:
' Working . . . . . . .
'
' Length of the downloaded string: 39678.

Class MainWindow

    ' Mark the event handler with Async so you can use Await in it.
    Private Async Sub StartButton_Click(sender As Object, e As RoutedEventArgs)

        ' Call and await immediately.
        ' StartButton_Click suspends until AccessTheWebAsync is done.
        Dim contentLength As Integer = Await AccessTheWebAsync()

        ResultsTextBox.Text &= $"{vbCrLf}Length of the downloaded string: {contentLength}.{vbCrLf}"

    End Sub


    ' Three things to note about writing an Async Function:
    '  - The function has an Async modifier. 
    '  - Its return type is Task or Task(Of T). (See "Return Types" section.)
    '  - As a matter of convention, its name ends in "Async".
    Async Function AccessTheWebAsync() As Task(Of Integer)

        Using client As New HttpClient()

            ' Call and await separately. 
            '  - AccessTheWebAsync can do other things while GetStringAsync is also running.
            '  - getStringTask stores the task we get from the call to GetStringAsync. 
            '  - Task(Of String) means it is a task which returns a String when it is done.
            Dim getStringTask As Task(Of String) =
                client.GetStringAsync("https://docs.microsoft.com/dotnet")

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

            ' The Await operator suspends AccessTheWebAsync.
            '  - AccessTheWebAsync does not 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.
            Dim urlContents As String = Await getStringTask

            ' The Return statement specifies an Integer result.
            ' A method which awaits AccessTheWebAsync receives the Length value.
            Return urlContents.Length

        End Using

    End Function

    Sub DoIndependentWork()
        ResultsTextBox.Text &= $"Working . . . . . . .{vbCrLf}"
    End Sub

End Class

참조See also