Sdílet prostřednictvím


Asynchronní programování pomocí modifikátoru Async a operátoru Await (C# a Visual Basic)

Pomocí asynchronního programování se můžete vyhnout kritickým bodům a zlepšit celkovou rychlost reakce aplikace.Tradiční techniky pro psaní asynchronních aplikací však mohou být složité, takže je obtížné je napsat, ladit a udržovat.

Produkt Visual Studio 2012 zavádí zjednodušený postup pro asynchronní programování, které těží z asynchronní podpory v rozhraních .NET Framework 4,5 a prostředí Windows Runtime.Kompilátor na sebe přejímá náročnou práci, kterou vykonával vývojář, a vaše aplikace si zachovává logickou strukturu, která se podobá synchronnímu kódu.Výsledkem je, že získáte všechny výhody asynchronního programování při pouhém zlomku úsilí.

Toto téma obsahuje následující oddíly.

  • Asynchronní programování zlepšuje odezvu
  • Je snazší psát asynchronní metody
  • Co se děje v asynchronní metodě
  • Asynchronní metody v rozhraní API
  • Vlákna
  • Async a Await
  • Návratové typy a parametry
  • Konvence vytváření názvů
  • Související témata
  • Kompletní příklad
  • Příbuzná témata

Toto téma obsahuje přehled kdy a jak použít asynchronní programování a obsahuje odkazy na témata podpory, která obsahují podrobné informace a příklady.

Asynchronní programování zlepšuje odezvu

Asynchronie je nezbytná pro aktivity, které mohou potenciálně blokovat, například pokud vaše aplikace přistupuje na web.Přístup k webovému prostředku je někdy pomalý nebo zpožděný.Pokud je taková činnost blokována v rámci synchronního procesu, musí čekat celá aplikace.U asynchronního procesu může aplikace pokračovat v další práci, která nezávisí na webovém prostředku, dokud neskončí potenciálně blokující úloha.

Následující tabulka ukazuje typické oblasti, kde asynchronní programování zlepšuje rychlost reakce.Uvedená rozhraní API z rozhraní .NET Framework 4,5 a prostředí Windows Runtime obsahují metody, které podporují asynchronní programování.

Oblast aplikace

Podpora rozhraní API, která obsahují asynchronní metody

Webový přístup

HttpClient, SyndicationClient

Práce se soubory

StorageFile, StreamWriter, StreamReader, XmlReader

Práce s obrázky

MediaCapture, BitmapEncoder, BitmapDecoder

Programování WCF

Synchronní a asynchronní operace

Asynchronie je obzvláště užitečná pro aplikace, které přistupují k vláknu UI, protože všechny aktivity související s uživatelským rozhraním obvykle sdílí jedno vlákno.Pokud je jakýkoli proces blokován v synchronní aplikaci, jsou blokovány všechny.Vaše aplikace přestane reagovat a můžete dojít k závěru, že selhala, i když místo toho čeká.

Při použití asynchronních metod bude aplikace i nadále odpovídat na uživatelské rozhraní.Pokud nechcete čekat na dokončení, můžete změnit velikost nebo minimalizovat okno, například můžete zavřít aplikaci.

Asynchronní přístup přidává ekvivalent automatického přenosu do seznamu možností, z nichž můžete vybírat při vytváření asynchronní operace.To znamená, že získáte všechny výhody tradičního asynchronního programování, ale s mnohem menším úsilím ze strany vývojáře.

Je snazší psát asynchronní metody

Základem asynchronního programování jsou klíčová slova async a await v jazyce Visual Basic a klíčová slova async a await v jazyce C#.Pomocí těchto dvou klíčových slov můžete použít zdroje v rozhraních .NET Framework nebo prostředí Windows Runtime k vytvoření asynchronní metody téměř stejně snadno, jako vytváříte synchronní metody.Asynchronní metody, které můžete definovat pomocí operátorů async a await, jsou označovány jako asynchronní metody.

Následující příklad ukazuje asynchronní metodu.Téměř vše v rámci kódu by vám mělo být zcela známé.Komentáře volají funkce, které jste přidali při tvorbě asynchronie.

Na konci tohoto tématu můžete najít soubor kompletního příkladu a můžete si stáhnout ukázku z tématu Asynchronní vzor: Příklad z tématu „Asynchronní programování s Async a Await“.

' 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;
}

Pokud příkaz AccessTheWebAsync nemá žádnou práci, kterou lze provádět mezi voláním aktivity GetStringAsync a čekáním na její dokončení, můžete zjednodušit kód pomocí volání a čekání v následujícím jediném příkazu.

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

Následující charakteristiky představují shrnutí, co dělá předchozí příklad asynchronní metodou.

  • Podpis metody zahrnuje modifikátor Async nebo async.

  • Název asynchronní metody končí podle konvence příponou „Async“.

  • Návratový typ je jeden z následujících typů:

    • Task pokud vaše metoda disponuje návratovým příkazem, ve kterém je operand typu TResult.

    • Task pokud vaše metoda nemá návratový stav nebo vrátila příkaz bez operandu.

    • Void (Sub v jazyce Visual Basic), pokud píšete asynchronní obslužnou rutinu události.

    Další informace naleznete v části „Návratové typy a parametry“ dále v tomto tématu.

  • Metoda obvykle zahrnuje nejméně jeden očekávaný výraz, který označuje bod, kde metoda nemůže pokračovat, dokud očekávaná asynchronní operace nebude dokončena.Během této doby je metoda pozastavena a ovládací prvek se vrátí volajícímu metody.Další část tohoto tématu ukazuje, co se stane v okamžiku pozastavení.

V asynchronních metodách používáte zadaná klíčová slova a typy pro označení, jakou akci chcete provést, a kompilátor udělá zbytek, včetně udržování přehledu o tom, co musí nastat, když se řízení vrátí do bodu „await“ pozastavené metody.Některé běžné procesy, jako je zpracování smyček a výjimek, může být v tradičním asynchronním kódu obtížné zpracovat.V asynchronní metodě zapisujete tyto prvky podobně, jako byste to udělali v synchronním řešení, a problém je vyřešen.

Další informace o asynchronii v předchozích verzích rozhraní .NET Framework naleznete v tématu TPL a tradiční asynchronní programování v .NET Framework.

Co se děje v asynchronní metodě

Nejdůležitějším principem, který je třeba pochopit v asynchronním programování, je, jak ovládat přesuny toků od metody k metodě.Následující diagram vás provede procesem.

Trasování aplikace asynchronní

Čísla v diagramu odpovídají následujícím krokům.

  1. Obslužná rutina události zavolá a očekává asynchronní metodu AccessTheWebAsync.

  2. Příkaz AccessTheWebAsync vytvoří instanci HttpClient a volá asynchronní metodu GetStringAsync pro stažení obsahu webu ve formě řetězce.

  3. V rámci aktivity GetStringAsync se stane něco, co způsobí zastavení průběhu.Možná je třeba vyčkat na dokončení stahování nebo jiné blokující aktivity na webu.Chcete-li zabránit zablokování prostředků, aktivita GetStringAsync vrací řízení volajícímu, AccessTheWebAsync.

    Příkaz GetStringAsync vrátí Task, kde TResult je řetězec, a AccessTheWebAsync přiřadí úlohu proměnné getStringTask.Úloha představuje trvalý proces pro volání na aktivitu GetStringAsync se závazkem vytvářet aktuální řetězcovou hodnotu po dokončení práce.

  4. Protože úloha getStringTask dosud nebyla očekávána, metoda AccessTheWebAsync může pokračovat v další práci, která nezávisí na konečném výsledku aktivity GetStringAsync.Daná práce je reprezentována voláním synchronní metody DoIndependentWork.

  5. DoIndependentWork je synchronní metoda, která provede svou práci a vrátí výsledek volajícímu.

  6. Aktivita AccessTheWebAsync nemá dostatek práce, kterou můžete provést bez výsledku z úlohy getStringTask.Aktivita AccessTheWebAsync dále potřebuje vypočítat a vrátit délku staženého řetězce, ale metoda nemůže hodnotu vypočítat, dokud nebude mít řetězec k dispozici.

    Proto aktivita AccessTheWebAsync používá operátor await k pozastavení jeho průběhu a výnosu z ovládacího prvku v metodě, která volala aktivitu AccessTheWebAsync.Aktivita AccessTheWebAsync vrátí Task(Of Integer) nebo Task<int> volajícímu.Úloha představuje slib vyrábět celé číslo výsledku, který má délku staženého řetězce.

    [!POZNÁMKA]

    Pokud byla úloha GetStringAsync (a tedy getStringTask) dokončena dříve, než ji aktivita AccessTheWebAsync očekávala, ovládací prvek zůstane v aktivitě AccessTheWebAsync.Prostředky na zastavení a vrácení k aktivitě AccessTheWebAsync by byly ztraceny, pokud je volaný asynchronní proces (getStringTask) již dokončen a AccessTheWebSync nebude muset čekat na konečný výsledek.

    Uvnitř volajícího (v tomto případě obslužná rutina události) bude vzor zpracování pokračovat.Volající může při čekání na výsledek provádět další operace, které nejsou závislé na výsledku AccessTheWebAsync, nebo může volající použít funkci await okamžitě. Obslužná rutina události čeká na aktivitu AccessTheWebAsync a aktivita AccessTheWebAsync čeká na úlohu GetStringAsync.

  7. Úloha GetStringAsync dokončí a vytvoří výsledek řetězce.Výsledek řetězce není vrácený voláním na úlohu GetStringAsync tak, jak by se dalo očekávat. (Nezapomeňte, že metoda již vrátila úlohu v kroku 3.) Místo toho je výsledek řetězce uložen v úloze getStringTask, která představuje dokončení metody.Operátor await načítá výsledek z úlohy getStringTask.Přiřazovací příkaz přiřadí načtený výsledek do parametru urlContents.

  8. Pokud má řetězec výsledek aktivity AccessTheWebAsync, metoda může vypočítat délku řetězce.Pak je práce aktivity AccessTheWebAsync kompletní a můžete pokračovat v obslužné rutině události čekání.V úplném příkladu na konci tématu si můžete potvrdit, že obslužná rutina události načte a vytiskne hodnotu výsledné délky.

Pokud jste v oblasti asynchronního programování nováčky, zvažte rozdíl mezi synchronním a asynchronním chováním.Synchronní metoda je vrácena, jakmile je její práce dokončena (krok 5), ale asynchronní metoda vrátí hodnotu úlohy, když je její práce pozastavena (kroky 3 a 6).Když asynchronní metoda nakonec dokončí svou práci, je úloha označena jako dokončená a výsledek, pokud existuje, je uložen v úloze.

Další informace o toku řízení naleznete v tématu Řízení toku v asynchronních programech (C# a Visual Basic).

Asynchronní metody v rozhraní API

Možná vás zajímá, kde nalézt metody jako GetStringAsync, které podporují asynchronní programování.Rozhraní .NET Framework 4,5 obsahuje mnoho členů, které pracují s operátory async a await.Tyto členy můžete rozpoznat podle přípony „Async“, která je připojena k názvu členu a návratovému typu Task nebo Task.Například třída System.IO.Stream obsahuje metody jako CopyToAsync, ReadAsync a WriteAsync vedle synchronních metod CopyTo, Read a Write.

Rozhraní prostředí Windows Runtime také obsahuje mnoho metod, které lze použít s operátory async a await v aplikacích Windows Store.Další informace a příklady metod naleznete v tématu Rychlý start: asynchronní programování pomocí operátoru await, Asynchronní programování (Aplikace pro Windows Store) a WhenAny: přemostění rozhraní .NET Framework a prostředí Windows Runtime (C# a Visual Basic).

Vlákna

Asynchronní metody mají být neblokující operace.Výraz await v rámci asynchronní metody neblokuje aktuální vlákno, zatímco očekávaná úloha běží.Namísto toho se výraz zaregistruje pro zbývající metody jako pokračování a vrátí řízení volajícímu asynchronní metody.

Klíčová slova async a await nezpůsobí tvorbu dalších vláken.Asynchronní metody nevyžadují multithreading, protože asynchronní metoda není spuštěna ve vlastním vlákně.Metoda pracuje na aktuálním kontextu synchronizace a používá čas ve vlákně pouze v případě, že je metoda aktivní.Task.Run můžete použít pro přesun práce vázané na procesor do vlákna na pozadí, ale vlákno na pozadí nepomůže s procesem, který pouze čeká na zpřístupnění výsledků.

Asynchronní přístup při asynchronním programování se doporučuje v téměř každém případě existujících přístupů.Tento přístup je obecně lepší než BackgroundWorker pro operace vázané na vstup a výstup vzhledem k tomu, že kód je jednodušší a nemusíte si dávat pozor na konflikty časování.V kombinaci s Task.Run je asynchronní programování lepší než BackgroundWorker pro operace vázané na procesor, protože asynchronní programování odděluje koordinaci podrobností od spouštění kódu z práce Task.Run, která se převádí do fondu vláken.

Async a Await

Pokud pomocí modifikátoru Async nebo async určíte, že metoda je metodou asynchronní, povolíte tím následující dvě možnosti.

  • Označená asynchronní metoda může použít k určení místa pozastavení možnost Await nebo await.Operátor await sděluje kompilátoru, že s asynchronními metodami nelze za daným bodem pokračovat, dokud nebude dokončen očekávaný asynchronní proces.Během této doby se ovládací prvek vrátí volajícímu asynchronní metody.

    Pozastavení asynchronní metody na výrazu await nebude představovat východ z metody a bloky finally se nespustí.

  • Samotná označená asynchronní metoda může být očekávána metodami, které ji volaly.

Asynchronní metoda obvykle obsahuje jeden nebo více výskytů operátoru await, ale absence výrazů await nezpůsobí chybu při kompilaci.Pokud asynchronní metoda nepoužívá pro označení bodu pozastavení operátor await, metoda se provede jako synchronní navzdory modifikátoru async.Kompilátor u takových metod zahlásí upozornění.

Async, async, Await a await jsou kontextová klíčová slova.Další informace a příklady naleznete v následujících tématech:

Návratové typy a parametry

Při programování v rozhraní .NET Framework asynchronní metoda obvykle vrací Task nebo Task.V rámci asynchronní metody se u úlohy vrácené z volání do jiné asynchronní metody použije operátor await.

Metodu Task zadáte jako návratový typ metody, pokud metoda obsahuje příkaz Return (Visual Basic) nebo return (C#), který určuje typ operandu TResult.

Metodu Task můžete použít jako návratový typ, pokud metoda nemá žádný návratový příkaz nebo má návratový příkaz, který nevrací operand.

Následující příklad ukazuje, jak deklarovat a volat metodu, která vrací Task nebo 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();

Každá vrácená úloha představuje probíhající práci.Úloha zapouzdřuje informace o stavu asynchronního procesu a posléze buď konečný výsledek z procesu, nebo výjimku, kterou proces vyvolá v případě neúspěchu.

Asynchronní metoda může být také metoda Sub (Visual Basic) nebo může mít návratový typ void (C#).Tento typ vrácení se používá především k definování obslužných rutin událostí, kde je požadován návratový typ void.Asynchronní obslužné rutiny událostí často slouží jako výchozí bod pro asynchronní programy.

Asynchronní metoda, která je procedurou Sub nebo která má návratový typ void, nemůže být očekávána a volající metody vracející typ void nemůže zachytit žádné výjimky, které metoda vyvolá.

Asynchronní metoda nemůže deklarovat parametry ByRef v jazyce Visual Basic nebo parametry ref či out v jazyce C#, ale metoda může volat metody, které mají tyto parametry.

Další informace a příklady naleznete v tématu Asynchronní návratové typy (C# and Visual Basic).Další informace o tom, jak zachytávat výjimky v asynchronních metodách, naleznete v tématech try-catch (Referenční dokumentace jazyka C#) nebo Try...Catch....Finally – příkaz (Visual Basic).

Asynchronní rozhraní API v programování prostředí Windows Runtime mají jeden z následujících návratových typů, které jsou podobné úlohám:

Další informace a příklad naleznete v tématu Rychlý start: asynchronní programování pomocí operátoru await.

Konvence vytváření názvů

Podle konvencí připojte operátor „Async“ za názvy metod, které mají modifikátor Async nebo async.

Můžete ignorovat konvenci, kde událost, základní třída a rozhraní smlouvy navrhují odlišný název.Například byste neměli přejmenovat běžné obslužné rutiny událostí, jako například Button1_Click.

Související témata

Název

Popis

Ukázka

Návod: Přístup k webu pomocí modifikátoru Async a operátoru Await (C# a Visual Basic)

Ukazuje, jak převést synchronní řešení WPF na asynchronní řešení WPF.Aplikace stáhne řadu webových stránek.

Ukázka asynchronní metody: Přístup k webovému návodu (C# a Visual Basic)

Postupy: Rozšíření návodu asynchronních úloh pomocí metody Task.WhenAll (C# and Visual Basic)

Přidá Task.WhenAll k předchozímu návodu.Použití WhenAll zahájí všechna stahování současně.

Postupy: Paralelní provádění vícenásobných webových dotazů pomocí modifikátoru Async a operátoru Await (C# and Visual Basic)

Ukazuje, jak spustit několik úloh současně.

Ukázka asynchronní metody: Vytvoření více webových požadavků současně (C# a Visual Basic)

Asynchronní návratové typy (C# and Visual Basic)

Znázorňuje typy, které může vrátit asynchronní metoda, a vysvětluje, kdy se každý typ hodí.

Řízení toku v asynchronních programech (C# a Visual Basic)

Podrobně sleduje tok řízení pomocí sledu očekávání výrazů v asynchronním programu.

Ukázka asynchronní metody: Tok řízení v asynchronních programech (C# a Visual Basic)

Vyladění aplikace s modifikátorem Async (C# a Visual Basic)

Ukazuje, jak přidat k asynchronnímu řešení následující funkce:

Ukázka asynchronní metody: Jemné ladění aplikace (C# a Visual Basic)

Podpora vícenásobného přístupu v aplikacích s modifikátorem Async (C# a Visual Basic)

Ukazuje, jak zpracovat případy, ve kterých je aktivní asynchronní operace restartována po jejím spuštění.

WhenAny: přemostění rozhraní .NET Framework a prostředí Windows Runtime (C# a Visual Basic)

Ukazuje, jak propojit typy úloh v rozhraní .NET Framework a IAsyncOperations v rámci rozhraní prostředí Windows Runtime tak, aby bylo možné používat WhenAny``1 v metodě prostředí Windows Runtime.

Ukázka asynchronní metody: Přemostění mezi rozhraním .NET a modulem Windows Runtime (AsTask a WhenAny)

Asynchronní zrušení: přemostění rozhraní .NET Framework a prostředí Windows Runtime (C# a Visual Basic)

Ukazuje, jak propojit typy úloh v rozhraní .NET Framework a IAsyncOperations v rámci rozhraní prostředí Windows Runtime tak, aby bylo možné používat CancellationTokenSource v metodě prostředí Windows Runtime.

Ukázka asynchronní metody: Přemostění mezi rozhraními .NET a Windows Runtime (AsTask & zrušení)

Použití modifikátoru Async pro přístup k souborům (C# a Visual Basic)

Seznam a ukázka výhod použití operátorů async a await při přístupu k souborům.

Postupy: Použití ladicího programu u asynchronních metod

Znázorňuje tok řízení v příkazu await a ukazuje chování příkazů Krokovat s vnořením, Krokovat s přeskočením a Krokovat s vystoupením v rámci asynchronních metod.

Asynchronní vzor založený na úlohách (TAP)

Popisuje nový vzor pro asynchronii v rozhraní .NET Framework.Vzor je založen na typech Task a Task.

Rychlý start: Volání asynchronního rozhraní API v jazyce C# nebo Visual Basic

Ukazuje, jak použít operátory async a await v aplikaci Windows Store.

Asynchronní programování (Aplikace pro Windows Store)

Poskytuje přehled o asynchronním programování v rozhraní prostředí Windows Runtime.

Videa o asynchronním programování na Kanálu 9

Poskytuje odkazy na různá videa o asynchronním programování.

Kompletní příklad

Následující kód představuje soubor MainWindow.xaml.vb nebo MainWindow.xaml.cs z aplikace Windows Presentation Foundation (WPF), o které pojednává toto téma.Můžete si stáhnout ukázky z Ukázka asynchronní metody: Příklad z tématu „Asynchronní programování s Async a Await“.

' 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.

Viz také

Referenční dokumentace

async (Referenční dokumentace jazyka C#)

await – – operátor (Referenční dokumentace jazyka C#)

Await – operátor (Visual Basic)

Async (Visual Basic)

Další zdroje

Ukázka: Asynchronní programování rozhraní .NET pro aplikace webu Windows Store

Ukázka: Vytvoření webového klientu await

Ukázka (C#): Uložení kolekce do úložiště aplikací

Ukázka (Visual Basic): Uložení kolekce do úložiště aplikací