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

성능 병목 현상을 방지 하 고 비동기 프로그래밍을 사용 하 여 전체 응용 프로그램의 응답성을 향상 시킬 수 있습니다.그러나 전통적인 기술을 쓰는 비동기 응용 프로그램을 작성 하려면 어렵습니다 복잡할 수 있습니다에 대 한 디버깅 및 유지.

Visual Studio 2012간단한 접근 방법, 비동기 프로그래밍에서 지 원하는 비동기 활용 소개는 .NET Framework 4.5 , Windows 런타임.컴파일러는 개발자를 사용 하는 작업을 수행 하려면 어려운 작업을 수행 하 고 응용 프로그램 유사한 동기 코드의 논리적 구조를 유지 합니다.결과적으로 비동기 프로그래밍의 모든 이점을 활용할을 작업량의 일부분으로 가져옵니다.

이 항목에는 다음 단원이 포함되어 있습니다.

  • 비동기 응답 속도 향상 시킵니다.
  • 비동기 메서드를 작성 하기가 더 쉽습니다.
  • 비동기 메서드에서 수행 되는 작업
  • API Async 메서드
  • 스레드
  • 비동기 고 기다립니다
  • 반환 형식과 매개 변수
  • 명명 규칙
  • 관련 항목
  • 완성된 예제
  • 관련 항목

이 항목 시기 및 비동기 프로그래밍을 사용 하는 방법에 대 한 개요를 제공 하 고 지원 정보 및 예제를 포함 하는 항목에 대 한 링크를 포함 합니다.

비동기 응답 속도 향상 시킵니다.

숙지 잠재적으로 차단 된 웹 응용 프로그램에서 액세스할 때와 같은 활동에 대 한 필수적입니다.웹 리소스를 액세스 하는 속도가 느리거나 지연 된 경우도 있습니다.이러한 활동 동기 프로세스 내에서 차단 되 면 전체 응용 프로그램을 기다려야 합니다.비동기 프로세스에서 응용 프로그램은 잠재적 중단 작업이 완료 될 때까지 하는 웹 리소스에 종속 되지 않는 다른 작업을 계속할 수 있습니다.

다음 표에서 비동기 프로그래밍 응답성을 개선 하는 일반적인 영역이 표시 됩니다.나열 된 Api에서의 .NET Framework 4.5 및 Windows 런타임 비동기 프로그래밍을 지 원하는 메서드가 포함 되어 있습니다.

응용 프로그램 영역

비동기 메서드를 포함 하는 Api를 지원 합니다.

웹 액세스

HttpClientSyndicationClient

파일 작업

StorageFile, StreamWriter, StreamReader,XmlReader

이미지 작업

MediaCapture, BitmapEncoder, BitmapDecoder

WCF 프로그래밍

동기 및 비동기 작업

소켓 작업

Socket

숙지 UI와 관련 된 모든 활동은 일반적으로 하나의 스레드를 공유 하기 때문에 UI 스레드 액세스 응용 프로그램에 대 한 매우 중요 한 것을 증명 합니다.프로세스는 동기식 응용 프로그램에서 차단 된 경우에 모두 차단 됩니다.응용 프로그램이 응답을 중지 하 고 대신 바로 대기 중인 경우이 오류가 있는 경우 결론을 내릴 수 있습니다.

비동기 메서드를 사용 하면 응용 프로그램 UI에 응답 합니다 계속 됩니다.크기를 조정 하거나, 창을 최소화 수 있습니다 예를 들어, 또는 완료를 대기 하지 않으려면 응용 프로그램을 닫을 수 있습니다.

비동기 기반 방식 자동 전송에 해당 하는 비동기 작업을 설계할 때 선택할 수 있는 옵션 목록에 추가 합니다.즉, 개발자가 훨씬 적은 노력 하지만 기존의 비동기 프로그래밍의 모든 이점을 가져옵니다.

비동기 메서드를 작성 하기가 더 쉽습니다.

비동기Await Visual Basic 키워드 및 비동기기다립니다 키워드 C#에서 비동기 프로그래밍의 핵심입니다.이러한 두 가지 키워드를 사용 하 여.NET Framework 리소스를 사용할 수 있습니다 또는 Windows 런타임 비동기 메서드를 만들려면 거의 처럼 손쉽게 동기 메서드를 만듭니다.비동기 사용 하 여 정의 하 고 기다립니다 비동기 메서드를 비동기 메서드로 라고 합니다.

다음 예제에서는 비동기 메서드를 보여 줍니다.코드에서 거의 모든 작업을 완전히 익숙할 것입니다.메모의 숙지를 만들려면 추가 기능을 호출 합니다.

이 항목의 끝에 완성 된 예제 파일을 찾을 수 및 샘플에서 다운로드할 수 Async 샘플: 예 "비동기 프로그래밍으로 Async 및 기다립니다".

' Three things to note in the signature:
'  - The method has an Async modifier. 
'  - The return type is Task or Task(Of T). (See "Return Types" section.)
'    Here, it is Task(Of Integer) because the return statement returns an integer.
'  - The method name ends in "Async."
Async Function AccessTheWebAsync() As Task(Of Integer)

    ' You need to add a reference to System.Net.Http to declare client.
    Dim client As HttpClient = New HttpClient()

    ' GetStringAsync returns a Task(Of String). That means that when you await the
    ' task you'll get a string (urlContents).
    Dim getStringTask As Task(Of String) = client.GetStringAsync("https://msdn.microsoft.com")


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

    ' The Await operator suspends AccessTheWebAsync.
    '  - AccessTheWebAsync can't 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.
    ' Any methods that are awaiting AccessTheWebAsync retrieve the length value.
    Return urlContents.Length
End Function
// Three things to note in the signature:
//  - The method has an async modifier. 
//  - The return type is Task or Task<T>. (See "Return Types" section.)
//    Here, it is Task<int> because the return statement returns an integer.
//  - The method name ends in "Async."
async Task<int> AccessTheWebAsync()
{ 
    // You need to add a reference to System.Net.Http to declare client.
    HttpClient client = new HttpClient();

    // GetStringAsync returns a Task<string>. That means that when you await the
    // task you'll get a string (urlContents).
    Task<string> getStringTask = client.GetStringAsync("https://msdn.microsoft.com");

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

    // The await operator suspends AccessTheWebAsync.
    //  - AccessTheWebAsync can't 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.
    string urlContents = await getStringTask;

    // The return statement specifies an integer result.
    // Any methods that are awaiting AccessTheWebAsync retrieve the length value.
    return urlContents.Length;
}

경우 AccessTheWebAsync 간에 호출을 수행할 수 있는 작업이 없는 GetStringAsync 및 완료 대기를 하면 코드를 호출 하 고 기다리는 다음 단일 명령문으로 단순화할 수 있습니다.

Dim urlContents As String = Await client.GetStringAsync()
string urlContents = await client.GetStringAsync();

무엇 앞의 예제는 비동기 메서드를 만듭니다 다음과 같은 특징을 요약 합니다.

  • 메서드 시그니처에 포함 된 Async 또는 async 한정자입니다.

  • 규칙, 비동기 메서드의 이름에 "Async" 접미사로 끝납니다.

  • 반환 형식은 다음 형식 중 하나입니다.

    • Task<TResult>메서드를 TResult 형식의 피연산자가 있는 return 문이 있는 경우.

    • Task메서드가 return 문이 피연산자 없는 return 문이 있는 경우.

    • Void (는 Sub Visual Basic) 비동기 이벤트 처리기를 작성 하는 경우.

    자세한 내용은이 항목의 뒷부분에 나오는 "반환 형식 및 매개 변수"를 참조 하십시오.

  • 메서드는 일반적으로 하나 이상의 포함 되어 기다립니다 바뀌게 비동기 작업이 완료 될 때까지 메서드가 계속할 수 없습니다 하는 지점을 표시 하는 식입니다.한편 메서드를 일시 중단 하 고 메서드의 호출자에 게 제어를 반환 합니다.이 항목의 다음 단원인 일시 중단 지점에서 수행 되는 작업을 보여 줍니다.

비동기 메서드 유형과 제공 된 키워드를 사용 하 여 작업을 수행 하려면 지정 합니다 및 컴파일러 await 지점에서 일시 중지 된 메서드에 컨트롤을 반환 하는 경우 어떻게 해야을 추적을 비롯 하 여 나머지는 않습니다.일부 일상적인 프로세스, 루프, 예외 처리 등 기존의 비동기 코드를 처리 하는 것이 어려울 수 있습니다.비동기 메서드에서 이러한 요소는 동기 솔루션에 포함 해야 하 고 문제가 해결 되는 만큼 작성 합니다.

숙지 하는 이전 버전의.NET Framework 대 한 자세한 내용은 참조 하십시오. TPL 및 일반적인 .NET 비동기 프로그래밍.

비동기 메서드에서 수행 되는 작업

비동기 프로그래밍을 이해 하는 가장 중요 한 점은 흐름 제어 메서드를 이동 하는 방법을 것입니다.다음은 과정을 안내 합니다.

비동기 프로그램 추적

다음 단계를 다이어그램의 번호에 해당합니다.

  1. 이벤트 처리기를 호출 하 고 잠그고는 AccessTheWebAsync 비동기 메서드가 있습니다.

  2. AccessTheWebAsync만들고는 HttpClient 인스턴스 및 호출을 GetStringAsync 문자열로 웹 사이트의 콘텐츠를 다운로드 하는 비동기 메서드.

  3. 발생 GetStringAsync 그 진행 상태를 일시 중단 합니다.아마도 다운로드 또는 일부 차단 작업을 웹 사이트에 대 한 기다려야 합니다.리소스를 차단 하지 않으려면 GetStringAsync 해당 호출자에 게 컨트롤 생성 AccessTheWebAsync.

    GetStringAsync반환는 Task<TResult> TResult 문자열인 경우 및 AccessTheWebAsync 작업에 할당 된 getStringTask 변수.지속적인 프로세스를 호출 하는 작업을 나타내는 GetStringAsync, 작업이 완료 되 면에서 실제 문자열 값을 생성 하는 노력을 합니다.

  4. 때문에 getStringTask 아직 갖 되지 않은 AccessTheWebAsync 에서 최종 결과에 의존 하지 않는 다른 작업을 계속할 수 있습니다 GetStringAsync.동기 메서드를 호출 하 여 작업 표시 되도록 DoIndependentWork.

  5. DoIndependentWork해당 작업을 수행 하 고 호출자에 게 반환 하는 동기 메서드입니다.

  6. AccessTheWebAsync작업 결과를 하지 않고 할 수 있는 부족 getStringTask.AccessTheWebAsync문자열 메서드를 가질 때까지 계산 하 고는 다운로드 된 문자열 길이 반환 하는 다음 씨 값을 계산할 수 없습니다.

    따라서 AccessTheWebAsync await 연산자 진행 상황을 일시 중지 하 고 컨트롤을 호출 하는 메서드를 사용 하 여 AccessTheWebAsync.AccessTheWebAsync반환 된 Task(Of Integer) 또는 Task<int> 호출자에 게 있습니다.약속을 다운로드 된 문자열의 길이가 정수 결과 생성 하는 작업을 나타냅니다.

    [!참고]

    경우 GetStringAsync (즉 getStringTask) 전에 완료 된 AccessTheWebAsync 해당 컨트롤 유지에 잠그고 AccessTheWebAsync.일시 중단 및 다음 돌아가기 지출 AccessTheWebAsync 경우 데 낭비 되는 비동기 프로세스 호출된 (getStringTask) 이미 완료 및 Accessthewebsync의 최종 결과를 기다릴 수 없는.

    호출자 (이 예제에서는 이벤트 처리기) 내부 프로세스가 반복 됩니다.호출자가 결과에 의존 하지 않는 다른 작업을 수행할 수 있습니다 AccessTheWebAsync 호출자 또는 해당 결과 기다리는 즉시 기다립니다 수 있습니다 전에.이벤트 처리기는 await 식에 도달 하면 응용 프로그램의 완료에 중점적으로 GetStringAsync.이벤트 처리기에 대 한 기다리고 AccessTheWebAsync, 및 AccessTheWebAsync 기다리고 GetStringAsync.

  7. GetStringAsync완료 하 고 결과 문자열을 생성 합니다.문자열 결과 호출에 의해 반환 되지 않을 수도 GetStringAsync 예상 하는 방식에서입니다.(메서드의 작업 3 단계에서 이미 반환 했음을 기억 합니다.) 작업의 완료 메서드를 나타내는 문자열 결과 저장 대신 getStringTask.Await 연산자에서 결과 검색 getStringTask.검색된 결과에 할당 문은 할당 urlContents.

  8. 때 AccessTheWebAsync 문자열 결과,이 메서드는 문자열의 길이 계산할 수 있습니다.다음의 작업 AccessTheWebAsync 도 완료 되 고 대기 중인 이벤트 처리기를 다시 시작할 수 있습니다.항목의 끝에 전체 예제에서 이벤트 처리기를 검색 하 고 인쇄 하는 결과 값은 길이 확인할 수 있습니다.

비동기 프로그래밍에 익숙하지 않은 동기 및 비동기 동작의 차이점을 고려해 야 할 몇 분을 걸립니다.작업 완료율 (5 단계), 하지만 비동기 메서드는 작업이 일시 중단 (3-6 단계) 될 때 작업 값을 반환 하면 동기 메서드를 반환 합니다.비동기 메서드 최종적으로 해당 작업을 완료 하면 작업을 완료 됨으로 표시 하 고 결과, 있는 경우 작업에 저장 됩니다.

제어 흐름에 대 한 자세한 내용은 비동기 프로그램의 제어 흐름(C# 및 Visual Basic).

API Async 메서드

같은 메서드를 제공 하는 곳 궁금할 것 GetStringAsync 비동기 프로그래밍을 지 원하는..NET Framework 4.5 와 비동기 작업과 기다립니다 많은 멤버를 포함 합니다.이러한 멤버 멤버 이름 및 반환 형식에 연결 된 접미사 "Async"로 인식할 수 있는 Task 또는 Task<TResult>.예를 들어, System.IO.Stream 클래스 메서드 같은 포함 CopyToAsync, ReadAsync, 및 WriteAsync 함께 동기 메서드 CopyTo, Read, 및 Write.

Windows 런타임 도 async로 사용 하 고 기다립니다에서 많은 메서드가 포함 되어 있습니다 Windows 스토어 응용 프로그램입니다.자세한 내용 및 예제 메서드를 참조 하십시오. 퀵 스타트: await 연산자를 사용 하 여 비동기 프로그래밍에 대 한, (Windows 저장소 응용) 비동기 프로그래밍, 및 WhenAny: .NET Framework와 Windows 런타임 간 브리징(C# 및 Visual Basic).

스레드

비동기 메서드 비블로킹으로 의도 된 작업입니다.바뀌게 작업이 실행 되는 동안 await 식의 비동기 메서드는 현재 스레드를 차단 되지는 않습니다.대신 식 나머지는 연속 메서드를 서명 하 고 비동기 메서드가 호출자에 제어를 반환 합니다.

Async 및 기다립니다 키워드 추가 스레드를 만들 수 발생 하지 않습니다.비동기 메서드는 자체 스레드에서 실행 되지 않는 때문에 비동기 메서드가 다중 스레딩을 하지 않아도 됩니다.메서드는 현재 동기화 컨텍스트에서 실행 되 고 시간 메서드에서 활성 경우에 스레드를 사용 하 여.사용 하면 Task.Run CPU 바인딩된 작업 백그라운드 스레드에서 하지만 배경으로 이동 하려면 스레드 바로 결과를 사용할 수 있게 되기를 기다리고 있는 프로세스와 해결 되지.

기존 방법은 거의 모든 경우에서에 비동기 기반 비동기 프로그래밍 방법을 사용 하는 것이 좋습니다.특히이 방법 보다 더입니다 BackgroundWorker IO 바운드에 대 한 작업 코드는 간단 하 고 보호할 필요가 있기 때문에 대해 경쟁 조건.함께에서 Task.Run, 비동기 프로그래밍 하는 것 보다는 BackgroundWorker cpu 관련 작업에 대 한 비동기 프로그래밍 코드에서 작업을 실행의 세부 사항을 조정 구분 하므로 Task.Run threadpool에 전송 합니다.

비동기 고 기다립니다

메서드는 비동기 메서드를 사용 하 여 임을 지정 하는 경우는 비동기 또는 비동기 한정자를 다음 두 가지 기능을 사용 하도록 설정 합니다.

  • 표시 된 비동기 메서드를 사용할 수 있습니다 Await 또는 기다립니다 일시 중단 지점을 지정 합니다.Await 연산자는 컴파일러 바뀌게 비동기 프로세스가 완료 될 때까지 비동기 메서드가 해당 지점을 계속할 수 없습니다 알려 줍니다.한편 비동기 메서드 호출자에 게 컨트롤을 반환합니다.

    Await 식에서 비동기 메서드의 일시에서 메서드를 구성 하지 않는 한 finally 블록이 실행 되지.

  • 표시 된 비동기 메서드 자체 메서드를 호출 하는 메서드에 의해 갖 수 있습니다.

Await 연산자의 하나 이상의 발생 하는 비동기 메서드를 일반적으로 포함 되지만 await 식이 없으면 컴파일러 오류가 발생 하지 않습니다.비동기 메서드는 일시 중단 지점을 표시 하려면 await 연산자를 사용 하지 않으면 동기 메서드를 비동기 한정자도 불구 하 고 마찬가지로 메서드를 실행 합니다.컴파일러는 이러한 방법에 대 한 경고가 표시 됩니다.

Async, async, Await, and await are contextual keywords.자세한 내용 및 예제는 다음 항목을 참조 하십시오.

반환 형식과 매개 변수

비동기 메서드는.NET Framework 프로그래밍에는 일반적으로 반환 된 Task 또는 Task<TResult>.비동기 메서드에서 다른 비동기 메서드 호출에서 반환 되는 작업 await 연산자 적용 됩니다.

지정한 Task<TResult> 메서드가 포함 되어 있으면 반환 되는 형식으로는 반환 (Visual Basic) 또는 반환 형식의 피연산자가 지정 (C#) 문 TResult.

사용 하 여 Task 메서드가 return 문이 피연산자를 반환 하지 않는 return 문이 있는 경우 반환 되는 형식으로.

다음 예제에서는 선언 하 고 반환 하는 메서드를 호출 하는 방법을 보여 줍니다.를 Task<TResult> 또는 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()
// Signature specifies Task<TResult>
async Task<int> TaskOfTResult_MethodAsync()
{
    int hours;
    // . . .
    // Return statement specifies an integer result.
    return hours;
}

// Calls to TaskOfTResult_MethodAsync
Task<int> returnedTaskTResult = TaskOfTResult_MethodAsync();
int intResult = await returnedTaskTResult;
// or, in a single statement
int intResult = await TaskOfTResult_MethodAsync();


// Signature specifies Task
async Task Task_MethodAsync()
{
    // . . .
    // The method has no return statement.  
}

// Calls to Task_MethodAsync
Task returnedTask = Task_MethodAsync();
await returnedTask;
// or, in a single statement
await Task_MethodAsync();

각 작업을 나타내는 진행 중인 작업을 반환 합니다.작업의 비동기 프로세스, 결국 프로세스에서 최종 결과 또는 성공 하지 않는 경우 프로세스를 발생 시키는 예외 상태에 대 한 정보를 캡슐화 합니다.

비동기 메서드는 수도 있습니다는 Sub 메서드 (Visual Basic) 또는 void 반환 형식 (C#).반환 형식은 주로 이벤트 처리기를 정의 하는 데 사용 위치는 void 반환 형식이 필요 합니다.비동기 이벤트 처리기는 비동기 프로그램을 위한 시작 지점 역할을 합니다.

비동기 메서드는 그 거는 Sub 프로시저 않았거나는 void 반환 형식을 갖 수 없습니다, 그리고 및 void를 반환 하는 메서드의 호출자가 메서드에서 throw 하는 예외를 catch 할 수 없습니다.

비동기 메서드를 선언할 수 없습니다 ByRef 매개 변수에서 Visual Basic 또는 ref 또는 아웃 C# 있지만 메서드 매개 변수에 이러한 매개 변수가 있는 메서드를 호출할 수 있습니다.

자세한 내용과 예제를 보려면 비동기 반환 형식(C# 및 Visual Basic)을 참조하십시오.Async 메서드에서 예외를 catch 하는 방법에 대 한 자세한 내용은 try-catch(C# 참조) 또는 Try...Catch...Finally 문(Visual Basic).

비동기 Api에서 Windows 런타임 프로그래밍 작업을 유사한 다음 반환 형식 중 하나를 가질:

자세한 내용과 예제는를 참조 하십시오. 퀵 스타트: await 연산자를 사용 하 여 비동기 프로그래밍에 대 한.

명명 규칙

규칙에 따라 메서드를 이름에 "Async" 추가 된 Async 또는 async 한정자입니다.

여기서 다른 이름을 이벤트, 기본 클래스 또는 인터페이스의 계약을 제안 하는 규칙을 무시할 수 있습니다.예를 들어, 공통 이벤트 처리기를 같은 이름을 안 Button1_Click.

관련 항목

제목

설명

샘플

연습: Async 및 Await를 사용하여 웹에 액세스(C# 및 Visual Basic)

비동기 WPF 솔루션에 동기 WPF 솔루션을 변환 하는 방법을 보여 줍니다.일련의 웹 사이트의 응용 프로그램을 다운로드합니다.

Async 샘플: 웹 연습 (C# 및 Visual Basic) 액세스

방법: Task.WhenAll을 사용하여 연습 확장(C# 및 Visual Basic)

추가 Task.WhenAll 이전 연습 합니다.사용 하는 WhenAll 동시에 모든 다운로드를 시작 합니다.

방법: 병렬로 여러 웹 요청 만들기(C# 및 Visual Basic)

동시에 여러 작업을 시작 하는 방법을 보여 줍니다.

Async 샘플: 여러 웹 요청 병렬로 (C# 및 Visual Basic)을

비동기 반환 형식(C# 및 Visual Basic)

비동기 메서드를 반환할 수 있는 형식을 설명 하 고 각 유형에 적합 설명 합니다.

비동기 프로그램의 제어 흐름(C# 및 Visual Basic)

흐름 제어를 통해 연달아를 자세히 추적 식에서 비동기 프로그램을 기다립니다.

Async 샘플: 제어 흐름에서 비동기 프로그램 (C# 및 Visual Basic)

Async 응용 프로그램 미세 조정(C# 및 Visual Basic)

비동기 솔루션에는 다음과 같은 기능을 추가 하는 방법을 보여 줍니다.

Async 샘플: 미세 조정 (C# 및 Visual Basic) 응용 프로그램

비동기 응용 프로그램에서 재진입 처리(C# 및 Visual Basic)

현재 비동기 작업 다시 시작이 실행 되는 동안에 처리 하는 방법을 보여 줍니다.

WhenAny: .NET Framework와 Windows 런타임 간 브리징(C# 및 Visual Basic)

.NET Framework 작업 종류와 Iasyncoperations에 연결 하는 방법을 보여 줍니다 있는 Windows 런타임 사용할 수 있도록 WhenAny 에 Windows 런타임 메서드.

Async 샘플:.NET Windows 런타임 (AsTask 및 WhenAny) 사이의 브리지

취소: .NET Framework와 Windows 런타임 간 브리징(C# 및 Visual Basic)

.NET Framework 작업 종류와 Iasyncoperations에 연결 하는 방법을 보여 줍니다 있는 Windows 런타임 사용할 수 있도록 CancellationTokenSource 에 Windows 런타임 메서드.

Async 샘플:.NET 및 Windows 런타임 간의 브리지 (AsTask & 취소)

파일 액세스에 Async 사용(C# 및 Visual Basic)

비동기 사용 하는 이점을 보여 줍니다. 나열 및 파일에 액세스할 수를 기다립니다.

연습: Async 메서드에 디버거 사용

제어 흐름에는 await 문 보여주고 동작을 보여 줍니다 있는 단계에, 단계 위에, 및 나가기 비동기 메서드 내에서 명령을.

TAP(작업 기반 비동기 패턴)

새 패턴을 숙지 하는.NET Framework 설명합니다.패턴 기반으로 TaskTask<TResult> 형식입니다.

퀵 스타트: C# 또는 Visual Basic 비동기 Api 호출

Async에서 기다립니다 하는 방법을 보여 줍니다 있는 Windows 스토어 응용 프로그램입니다.

비동기 프로그래밍 (프로그램 Windows 저장소)

비동기 프로그래밍의 개요를 제공의 Windows 런타임.

비동기 채널 9 비디오

비동기 프로그래밍에 대 한 비디오의 다양 한 링크를 제공합니다.

완성된 예제

다음 코드는 MainWindow.xaml.vb 또는 MainWindow.xaml.cs 파일에서이 항목에 설명 하는 Windows Presentation Foundation (WPF) 응용 프로그램입니다.샘플에서 다운로드할 수 Async 샘플: 예 "비동기 프로그래밍으로 Async 및 기다립니다".

' Add an Imports statement and a reference for System.Net.Http
Imports System.Net.Http

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 separately.
        'Task<int> getLengthTask = AccessTheWebAsync();
        '' You can do independent work here.
        'int contentLength = await getLengthTask;

        Dim contentLength As Integer = Await AccessTheWebAsync()

        ResultsTextBox.Text &=
            String.Format(vbCrLf & "Length of the downloaded string: {0}." & vbCrLf, contentLength)
    End Sub


    ' Three things to note in the signature:
    '  - The method has an Async modifier. 
    '  - The return type is Task or Task(Of T). (See "Return Types" section.)
    '    Here, it is Task(Of Integer) because the return statement returns an integer.
    '  - The method name ends in "Async."
    Async Function AccessTheWebAsync() As Task(Of Integer)

        ' You need to add a reference to System.Net.Http to declare client.
        Dim client As HttpClient = New HttpClient()

        ' GetStringAsync returns a Task(Of String). That means that when you await the
        ' task you'll get a string (urlContents).
        Dim getStringTask As Task(Of String) = client.GetStringAsync("https://msdn.microsoft.com")


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

        ' The Await operator suspends AccessTheWebAsync.
        '  - AccessTheWebAsync can't 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.
        ' Any methods that are awaiting AccessTheWebAsync retrieve the length value.
        Return urlContents.Length
    End Function


    Sub DoIndependentWork()
        ResultsTextBox.Text &= "Working . . . . . . ." & vbCrLf
    End Sub
End Class

' Sample Output:

' Working . . . . . . .

' Length of the downloaded string: 41763.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;

// Add a using directive and a reference for System.Net.Http;
using System.Net.Http;

namespace AsyncFirstExample
{
    public partial class MainWindow : Window
    {
        // Mark the event handler with async so you can use await in it.
        private async void StartButton_Click(object sender, RoutedEventArgs e)
        {
            // Call and await separately.
            //Task<int> getLengthTask = AccessTheWebAsync();
            //// You can do independent work here.
            //int contentLength = await getLengthTask;

            int contentLength = await AccessTheWebAsync();

            resultsTextBox.Text +=
                String.Format("\r\nLength of the downloaded string: {0}.\r\n", contentLength);
        }


        // Three things to note in the signature:
        //  - The method has an async modifier. 
        //  - The return type is Task or Task<T>. (See "Return Types" section.)
        //    Here, it is Task<int> because the return statement returns an integer.
        //  - The method name ends in "Async."
        async Task<int> AccessTheWebAsync()
        { 
            // You need to add a reference to System.Net.Http to declare client.
            HttpClient client = new HttpClient();

            // GetStringAsync returns a Task<string>. That means that when you await the
            // task you'll get a string (urlContents).
            Task<string> getStringTask = client.GetStringAsync("https://msdn.microsoft.com");

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

            // The await operator suspends AccessTheWebAsync.
            //  - AccessTheWebAsync can't 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.
            string urlContents = await getStringTask;

            // The return statement specifies an integer result.
            // Any methods that are awaiting AccessTheWebAsync retrieve the length value.
            return urlContents.Length;
        }


        void DoIndependentWork()
        {
            resultsTextBox.Text += "Working . . . . . . .\r\n";
        }
    }
}

// Sample Output:

// Working . . . . . . .

// Length of the downloaded string: 41564.

참고 항목

참조

async(C# 참조)

await(C# 참조)

Await 연산자(Visual Basic)

Async(Visual Basic)