Udostępnij za pośrednictwem


Programowanie asynchroniczne z Async i Await (C# i Visual Basic)

Możesz uniknąć problemów z wydajnością i poprawić ogólny czas odpowiedzi aplikacji, stosując programowanie asynchroniczne.Jednak tradycyjne techniki pisania aplikacji asynchronicznych mogą być skomplikowane, przez co trudne do pisania, debugowania i konserwacji.

Visual Studio 2012 wprowadza uproszczone podejście, programowanie async, w którym wykorzystywana jest obsługa programowania asynchronicznego oferowana przez Program .NET Framework 4.5 i Środowisko wykonawcze systemu Windows.Kompilator wykonuje trudną pracę, którą kiedyś wykonywał programista, a aplikacja zachowuje strukturę logiczną przypominającą kod synchroniczny.W efekcie masz wszystkie korzyści wynikające z programowania asynchronicznego przy ułamkowym nakładzie pracy.

Ten temat zawiera następujące sekcje.

  • Programowanie async poprawia czas odpowiedzi
  • Pisanie metod async jest prostsze
  • Co dzieje się w metodzie async
  • Metody async interfejsu API
  • Wątki
  • Async i Await
  • Typy zwracane i parametry
  • Konwencje nazewnictwa
  • Tematy pokrewne
  • Kompletny przykład
  • Tematy pokrewne

Ten temat zawiera omówienie, kiedy i jak stosować programowanie async oraz zawiera łącza do tematów zawierających szczegółowe informacje oraz przykłady.

Programowanie async poprawia czas odpowiedzi

Asynchroniczność jest istotna dla działań, które mogą powodować blokowanie, na przykład, gdy aplikacja uzyskuje dostęp do sieci Web.Dostęp do zasobów sieci Web bywa powolny lub opóźniony.Jeśli takie działanie jest zablokowane w procesie synchronicznym, cała aplikacji musi czekać.W procesie asynchronicznym aplikacja może kontynuować wykonywanie innych zadań, które nie są zależne od zasobów sieci Web, do momentu zakończeniem zadania mogącego powodować blokowanie.

W poniższej tabeli przedstawiono typowe obszary, w których programowanie asynchroniczne poprawia czas odpowiedzi.Wymienione interfejsy API dostępne w Program .NET Framework 4.5 i Środowisko wykonawcze systemu Windows zawierają metody, które obsługują programowanie asynchroniczne.

Obszar aplikacji

Obsługa interfejsów API, która obejmuje metody asynchroniczne

Web access

HttpClient, SyndicationClient

Praca z plikami

StorageFile, StreamWriter, StreamReader, XmlReader

Praca z obrazami

MediaCapture, BitmapEncoder, BitmapDecoder

Programowanie WCF

Operacje synchroniczne i asynchroniczne

Asynchroniczność okazuje się szczególnie cenna w przypadku aplikacji, które mają dostęp do wątku interfejsu użytkownika, ponieważ wszystkie działania związane z interfejsem użytkownika korzystają zazwyczaj z jednego wątku.Jeśli w aplikacji synchronicznej jest zablokowany jakikolwiek proces, zablokowane są wszystkie procesy.Aplikacja przestanie odpowiadać i możesz dojść do wniosku, że uległa awarii, a tymczasem może po prostu być w stanie oczekiwania.

Kiedy używasz metod asynchronicznych, aplikacja dalej odpowiada interfejsowi użytkownika.Możesz przykładowo zmienić rozmiar lub zminimalizować aplikację lub możesz ją zamknąć, jeżeli nie chcesz czekać aż zakończy zadanie.

Podejście async oferuje również odpowiednik automatycznego przejścia do listy opcji do wybrania przy projektowaniu operacji asynchronicznych.Oznacza to, że można korzystać z wszystkich zalet tradycyjnego programowania asynchronicznego, ale przy znacznie mniejszym nakładzie pracy programisty.

Pisanie metod async jest prostsze

Słowa kluczowe Async i Await w języku Visual Basic oraz słowa kluczowe async i await w C# to jądro programowania asynchronicznego.Korzystając z tych dwóch słów kluczowych, można użyć zasobów .NET Framework lub Środowisko wykonawcze systemu Windows do tworzenia metody asynchronicznej w sposób niemal równie prosty jak przy tworzeniu metody synchronicznej.Metody asynchroniczne definiowane za pomocą słów kluczowych async i await są określane jako metody async.

W poniższym przykładzie przedstawiono metodę async.Prawie wszystko w kodzie powinno wyglądać znajomo.Komentarze wywołują funkcje dodawane przez użytkownika w celu uzyskania asynchroniczności.

Możesz odnaleźć pełny przykładowy plik na końcu tego tematu i możesz pobrać przykład z Przykład async: przykład z „Programowania asynchronicznego przy użyciu Async i 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;
}

Jeśli AccessTheWebAsync nie ma żadnych działań do wykonania pomiędzy wywołaniem GetStringAsync i oczekiwaniem na zakończenie wywołania, można uprościć kod, realizując wywołanie i oczekiwanie w następującej pojedynczej instrukcji.

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

Poniższy opis podsumowuje, co sprawia, że poprzedni przykład jest metodą asynchroniczną.

  • Podpis metody zawiera modyfikator Async lub async.

  • Nazwa metody async kończy się zwyczajowo sufiksem „Async”.

  • Zwracany typ może być jednym z następujących:

    • Task, jeśli metoda zawiera instrukcję Return, w której argument operacji jest typu TResult.

    • Task, jeśli metoda nie zawiera instrukcji return lub zawiera instrukcję return bez argumentu operacji.

    • Void (Sub w języku Visual Basic) w przypadku pisania programu async obsługi zdarzeń.

    Aby uzyskać więcej informacji, zobacz „Typy zwracane i parametry” w dalszej części tego tematu.

  • Metoda zazwyczaj zawiera co najmniej jedno wyrażenie „await”, które oznacza punkt, w którym metoda nie może kontynuować pracy do czasu ukończenia operacji asynchronicznej.W tym czasie metoda jest zawieszona, a sterowanie powraca do obiektu wywołującego metodę.Następna sekcji tego tematu przedstawia, co się dzieje w punkcie zawieszenia.

W metodzie asynchronicznej używasz podanych słów kluczowych i typów w celu wskazania, co chcesz zrobić, a kompilator zajmie się resztą, w tym śledzeniem tego, co musi się zdarzyć, gdy sterowanie powraca do punktu oczekiwania w metodzie zawieszonej.Niektóre procesy, takie jak pętle i obsługa wyjątków, mogą być trudne do obsłużenia w tradycyjnym kodzie asynchronicznym.W metodzie asynchronicznej wpisujesz te elementy podobnie jak w rozwiązaniu synchronicznym i problem rozwiązany.

Aby uzyskać więcej informacji dotyczących asynchroniczności w poprzednich wersjach .NET Framework, zobacz Programowanie asynchroniczne w TPL i standardowym .NET Framework.

Co dzieje się w metodzie async

Ważne jest, aby rozumieć programowanie asynchroniczne jako przepływ sterowania od metody do metody.Poniższy diagram ilustruje ten proces.

Śledzenia programu asynchroniczne

Liczby w diagramie odpowiadają poniższym krokom.

  1. Program obsługi zdarzeń wywołuje AccessTheWebAsync metodę async i czeka na nią.

  2. AccessTheWebAsync tworzy wystąpienie HttpClient i wywołuje metodę asynchroniczną GetStringAsync w celu pobrania zawartości witryny sieci Web jako ciągu.

  3. Coś się dzieje w metodzie GetStringAsync, co wstrzymuje jej postęp.Być może metoda musi czekać na pobranie strony internetowej lub inne działanie blokujące.Aby uniknąć blokowania zasobów, metoda GetStringAsync przekazuje sterowanie do obiektu wywołującego AccessTheWebAsync.

    GetStringAsync zwraca Task, gdzie TResult jest ciągiem, a AccessTheWebAsync przypisuje zadanie do zmiennej getStringTask.Zadanie przedstawia ciągły proces wywołania metody GetStringAsync ze zobowiązaniem utworzenia faktycznej wartości ciągu po ukończeniu pracy.

  4. Ponieważ nie miało jeszcze miejsca wywołanie getStringTask, AccessTheWebAsync można wykonywać inne prace, które nie są zależne od wyniku końcowego metody GetStringAsync.Ta praca jest reprezentowana przez wywołanie metody synchronicznej DoIndependentWork.

  5. DoIndependentWork jest metodą synchroniczną, która działa i wraca do miejsca wywołania.

  6. AccessTheWebAsync ma za mało pracy, którą może wykonywać bez wyniku metody getStringTask.AccessTheWebAsync chce następnie obliczyć i zwrócić długość pobranego ciągu, ale nie może obliczyć tej wartości dopóki metoda ma ciąg.

    Dlatego AccessTheWebAsync stosuje operator await, aby zawiesić postęp i przekazać sterowanie do metody, która wywołała AccessTheWebAsync.AccessTheWebAsync zwraca Task(Of Integer) lub Task<int> do obiektu wywołującego.Zadanie przedstawia obietnicę utworzenia w wyniku liczby całkowitej, która jest długością pobranego ciągu.

    [!UWAGA]

    Jeśli GetStringAsync (a co za tym idzie, getStringTask) zostanie zakończona, zanim AccessTheWebAsync zacznie na to czekać, sterowanie pozostanie w AccessTheWebAsync.Koszt zawieszenia, a następnie powrotu do AccessTheWebAsync zostałby zmarnowany, gdyby wywołany proces asynchroniczny (getStringTask) został już ukończony i AccessTheWebSync nie musiałby czekać na wynik końcowy.

    Przetwarzanie wzorca jest kontynuowane wewnątrz elementu wywołującego (programu obsługi zdarzeń w tym przykładzie).Obiekt wywołujący może wykonywać inne czynności, które nie są zależne od wyników AccessTheWebAsync zanim zacznie oczekiwać na wynik lub może natychmiast rozpocząć oczekiwanie. Program obsługi zdarzeń czeka na AccessTheWebAsync, a AccessTheWebAsync czeka na GetStringAsync.

  7. GetStringAsync kończy i produkuje wynik w postaci ciągu.Wynikowy ciąg nie jest zwracany przez wywołanie do GetStringAsync w sposób, jakiego można by oczekiwać. (Należy pamiętać, że metoda zwróciła już zadanie w kroku 3). Zamiast tego wynikowy ciąg jest zapisywany w zadaniu, które reprezentuje ukończenie metody getStringTask.Operator await pobiera wyniki z getStringTask.Instrukcja przypisania umieszcza pobrany wynik w urlContents.

  8. Gdy AccessTheWebAsync ma wynikowy ciąg, metoda może obliczyć jego długość.Następnie praca AccessTheWebAsync jest również zakończona i czekający program obsługi zdarzenia może wznowić działanie.W pełnym przykładzie na końcu tematu można zobaczyć, że program obsługi zdarzeń pobiera i drukuje wynikową wartość długości.

Jeśli dopiero zaczynasz przygodę z programowaniem asynchronicznym, zastanów się przez chwilę, jaka jest różnica między zachowaniem synchronicznym i asynchronicznym.Metoda synchroniczna kończy działanie, gdy praca jest zakończona (krok 5), natomiast metoda asynchroniczna zwraca wartość zadania, gdy jej praca jest zawieszona (kroki 3 i 6).Gdy metoda async ukończy pracę, zadanie jest oznaczane jako ukończone, a wynik, o ile istnieje, jest zapisywany w zadaniu.

Aby uzyskać więcej informacji dotyczących przepływu sterowania, zobacz Przepływ sterowania w aplikacjach asynchronicznych (C# i Visual Basic).

Metody async interfejsu API

Możliwe, że zastanawiasz się, gdzie znaleźć takie metody, jak GetStringAsync, które obsługują programowanie async.Program .NET Framework 4.5 zawiera wiele elementów obsługujących słowa kluczowe async i await.Możesz rozpoznać te elementy po przyrostku „Async”, który jest dołączony do nazwy elementu członkowskiego i zwracanego typu Task lub Task.Na przykład klasa System.IO.Stream zawiera na przykład metody CopyToAsync, ReadAsync i WriteAsync, a także synchroniczne metody CopyTo, Read i Write.

Środowisko wykonawcze systemu Windows zawiera również wiele metod, których można użyć ze słowami kluczowymi async i await w aplikacjach Windows Store.Aby uzyskać więcej informacji i obejrzeć przykładowe metody, zobacz Szybki Start: Korzystanie z operatora await w programowaniu asynchronicznym, Programowanie asynchroniczne (aplikacje Windows Store) i WhenAny: łączenie platformy .NET Framework ze środowiskiem wykonawczym systemu Windows (C# i Visual Basic).

Wątki

Metody async mają być operacjami niepowodującymi blokowania.Wyrażenie await w metodzie async nie blokuje bieżącego wątku, gdy oczekiwane zadanie jest uruchomione.Zamiast tego, wyrażenie rejestruje pozostałą część metody jako kontynuację i przekazuje sterowanie do obiektu wywołującego metody async.

Słowa kluczowe async i await nie powodują tworzenia dodatkowych wątków.Metody komunikacji async nie wymagają wielowątkowości, ponieważ nie działają we własnym wątku.Metoda działa w bieżącym kontekście synchronizacji i używa czasu wątku, tylko wtedy, gdy jest aktywna.Można użyć Task.Run, aby przenieść wykonywanie zadań intensywnie angażujących procesor do wątku w tle, ale wątek w tle nie jest w stanie pomóc w przypadku procesu, który tylko oczekuje na dostępność wyników.

Podejście async do programowania asynchronicznego jest preferowane prawie w każdym przypadku.W szczególności, to podejście jest lepsze niż BackgroundWorker dla operacji związanych z wejściem/wyjściem, ponieważ kod jest prostszy i nie trzeba zabezpieczać się przed sytuacjami wyścigu.W połączeniu z Task.Run programowanie async jest lepsze niż BackgroundWorker dla operacji związanych z procesorem, ponieważ programowanie async oddziela kwestie koordynacji uruchamiania kodu od działań, które Task.Run przenosi do puli wątków.

Async i Await

Jeśli określisz, że metoda jest metodą async za pomocą modyfikatora Async lub async, włączysz następujące dwie możliwości.

  • Metoda oznaczona jako async może użyć modyfikatora Await lub await do wskazania punktów zawieszenia.Operator await informuje kompilator, że metoda async nie może kontynuować działania do chwili zakończenia procesu asynchronicznego, na który oczekuje.W międzyczasie sterowanie powraca do obiektu wywołującego metodę async.

    Zawieszenie metody async na wyrażeniu await nie stanowi wyjścia z metody i bloki finally nie są wykonywane.

  • Metoda oznaczona jako async sama może być oczekiwana przez metody, które ją wywołują.

Metoda async zazwyczaj zawiera co najmniej jedno wystąpienie operatora await, ale brak wyrażeń await nie powoduje błędu kompilatora.Jeśli metoda async nie używa operatora await, aby oznaczyć punkt zawieszenia, metoda jest wykonywana jak metoda synchroniczna, pomimo modyfikatora async.Kompilator generuje ostrzeżenia dla takich metod.

Async, async, Await i await są kontekstowymi słowami kluczowymi.Aby uzyskać więcej informacji i przykładów, zobacz następujący temat:

Typy zwracane i parametry

W programowaniu .NET Framework, metoda async zwykle zwraca Task lub Task.Wewnątrz metody async operator await jest stosowany do zadania, które jest zwracane z wywołania do innej metody async.

Należy określić Task jako typ zwracany, jeśli metoda zawiera instrukcję Return (Visual Basic) lub return (C#), która określa argument operacji typu TResult.

Jeśli metoda nie zawiera instrukcji return albo instrukcja nie zwraca argumentu operacji, należy użyć Task jako typ zwracanego.

Poniższy przykład przedstawia, jak deklarować i wywoływać metodę zwracającą Task lub 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żde zwracane zadanie reprezentuje zadanie pracy w toku.Zadanie zawiera informacje o stanie procesu asynchronicznego i, ostatecznie, albo ostatecznego wyniku procesu lub wyjątku, który zgłasza proces, jeśli się nie powiedzie.

Metoda async może być również metodą Sub (Visual Basic) lub być typu void (C#).Ten typ zwracany jest używany głównie do definiowania programów obsługi zdarzeń, gdzie jest wymagany typ zwracany void.Programy async obsługi zdarzeń często służą jako punkt wejścia dla programów async.

Metoda async będąca procedurą Sub lub mającą typ zwracany void nie może być oczekiwana, a obiekt wywołujący metodę zwracającą typ void nie może przechwycić wyjątków generowanych przez metodę.

Metoda async nie można deklarować parametrów ByRef w języku Visual Basic lub ref lub out w języku C#, ale może wywoływać metody mające takie parametry.

Aby uzyskać więcej informacji i przykładów, zobacz Asynchroniczne typy zwracane (C# i Visual Basic).Aby uzyskać więcej informacji dotyczących przechwytywania wyjątków w metodach async, zobacz try-catch (odwołanie w C#) lub Try...Catch...Finally — Instrukcja (Visual Basic).

Asynchroniczne interfejsy API w programowaniu Środowisko wykonawcze systemu Windows mają jeden z następujących typów zwracanych, które są podobne do zadań:

Aby uzyskać więcej informacji i obejrzeć przykład, zobacz Szybki start: Korzystanie z operatora await w programowaniu asynchronicznym.

Konwencje nazewnictwa

Zgodnie z konwencją dołącza się „Async” do nazw metod mających modyfikator Async lub async.

Można zignorować konwencję, gdy zdarzenie, klasa bazowa lub kontrakt interfejsu sugeruje inną nazwę.Na przykład nie należy zmieniać nazw często używanych procedur obsługi zdarzeń, takich jak Button1_Click.

Tematy pokrewne

Tytuł

Opis

Przykład

Wskazówki: uzyskiwanie dostępu do sieci za pomocą Async i Await (C# i Visual Basic)

Przedstawia, w jaki sposób konwertować synchroniczne rozwiązanie WPF do asynchronicznego rozwiązania WPF.Ta aplikacja pobiera szereg witryn sieci Web.

Przykład async: Instruktaż dotyczący uzyskiwania dostępu do Internetu (C# i Visual Basic)

Porady: rozszerzanie wskazówek asynchronicznych za pomocą Task.WhenAll (C# i Visual Basic)

Dodaje Task.WhenAll do poprzedniego przeglądania.Użycie WhenAll rozpoczyna wszystkie akcje pobierania w tym samym momencie.

Porady: równoległe żądania sieci Web za pomocą Async i Await (C# i Visual Basic)

Ilustruje, jak uruchomić kilka zadań w tym samym czasie.

Przykład async: Wiele równoległych żądań witryn sieci Web (C# i Visual Basic)

Asynchroniczne typy zwracane (C# i Visual Basic)

Ilustruje typy zwracane przez metody async i wyjaśnia, kiedy poszczególne typy są odpowiednie.

Przepływ sterowania w aplikacjach asynchronicznych (C# i Visual Basic)

Śledzi szczegółowo przepływ sterowania w serii wyrażeń await w programie asynchronicznym.

Przykład async: Przepływ sterowania w programach async (C# i Visual Basic)

Dostrajanie aplikacji Async (C# i Visual Basic)

Przedstawia, w jaki sposób dodać następujące funkcje do rozwiązania async:

Przykład async: Dostrajanie aplikacji (C# i Visual Basic)

Obsługa ponownego rozpoczęcia w aplikacjach asynchronicznych (C# i Visual Basic)

Przedstawia, w jaki sposób obsługiwać przypadki, w których podczas działania uruchamiana jest ponownie aktywna operacja asynchroniczna.

WhenAny: łączenie platformy .NET Framework ze środowiskiem wykonawczym systemu Windows (C# i Visual Basic)

Przedstawia, w jaki sposób łączyć typy zadań w .NET Framework i IAsyncOperations w Środowisko wykonawcze systemu Windows, aby można było użyć WhenAny``1 z metodą Środowisko wykonawcze systemu Windows.

Przykład async: Połączenie .NET i środowiska wykonawczego systemu Windows (AsTask i WhenAny)

Anulowanie asynchroniczne: łączenie platformy .NET Framework ze środowiskiem wykonawczym systemu Windows (C# i Visual Basic)

Przedstawia, w jaki sposób łączyć typy Task w .NET Framework i IAsyncOperations w Środowisko wykonawcze systemu Windows, aby można było użyć CancellationTokenSource z metodą Środowisko wykonawcze systemu Windows.

Przykład async: Połączenie .NET i środowiska wykonawczego systemu Windows (AsTask & Anulowanie)

Użycie Async do uzyskiwania dostępu do plików (C# i Visual Basic)

Wyświetla listę korzyści wynikających ze stosowania słów kluczowych async i await przy uzyskiwaniu dostępu do plików.

Wskazówki: Korzystanie z debugera i metod asynchronicznych

Ilustruje przepływ sterowania w instrukcji await i przedstawia działanie poleceń Wejdź, Przejdź, i Wyjdź w metodach async.

Wzorzec asynchroniczny oparty na zadaniach (TAP)

Opisano nowy wzorzec asynchronii w .NET Framework.Wzorzec jest oparty na typach Task and Task.

Szybki start: Wywoływanie asynchronicznych API w języku C# lub Visual Basic

Przedstawia, w jaki sposób używać słów kluczowych async i await w aplikacji Windows Store.

Programowanie asynchroniczne (aplikacji w Sklepie Windows)

Zawiera omówienie programowania asynchronicznego w Środowisko wykonawcze systemu Windows.

Asynchroniczne wideo w witrynie Channel 9

Oferuje łącza do różnych plików wideo dotyczących programowania asynchronicznego.

Kompletny przykład

Następujący kod to plik MainWindow.xaml.vb lub MainWindow.xaml.cs z aplikacji Windows Presentation Foundation (WPF), które ten temat omawia.Możesz pobrać przykład ze strony Przykład async: przykład z „Programowania asynchronicznego przy użyciu Async i 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.

Zobacz też

Informacje

async (odwołanie w C#)

await (odwołanie w C#)

Await — Operator (Visual Basic)

Async (Visual Basic)

Inne zasoby

Przykład: Programowanie asynchroniczne .NET aplikacji w Sklepie Windows

Przykład: Tworzenie oczekującego klienta sieci Web

Przykład (C#): Zapisz kolekcję do magazynu aplikacji

Przykład (Visual Basic): Zapisz kolekcję do magazynu aplikacji