Asynchroniczne programowania przy użyciu asynchronicznej i poczekać (C# i Visual Basic)
Można uniknąć wąskich gardeł i zwiększyć ogólną sprawność reakcji aplikacji przy użyciu asynchronicznego programowania.Jednakże tradycyjnych technik pisaniem asynchronicznego aplikacji może być skomplikowane, co czyni je trudno napisać, debugowania i utrzymania.
Visual Studio 2012wprowadza metoda uproszczona asynchronicznego programowania, że wykorzystuje asynchroniczne obsługują w .NET Framework 4.5 i Środowisko wykonawcze systemu Windows.Kompilator nie używaną przez autora robić pracę, a aplikacja zachowuje struktury logicznej, podobny do kodu synchronicznych.W efekcie uzyskać wszystkie zalety Programowanie asynchronicznego ułamek wysiłku.
Ten temat zawiera następujące sekcje.
- Asynchroniczne poprawia czas reakcji
- Metody komunikacji asynchronicznej są łatwiejsze do zapisu
- Co się dzieje w metodę komunikacji asynchronicznej
- Metody interfejsu API Async
- Wątki
- Asynchroniczne i czekają na
- Zwracanymi typami i parametry
- Konwencja nazewnictwa
- Tematy pokrewne
- Kompletny przykład
- Tematy pokrewne
Ten temat zawiera omówienie kiedy i jak używać async programowania i zawiera łącza do tematów, które zawierają szczegółowe informacje i przykłady obsługi.
Asynchroniczne poprawia czas reakcji
Asynchrony jest istotne dla działań, które są potencjalnie blokowanie, takich jak, kiedy aplikacja uzyskuje dostęp do sieci web.Dostęp do zasobów sieci web czasami jest powolne lub opóźnione.Jeśli takie działanie jest zablokowany w proces synchroniczny, musi czekać całej aplikacji.W procesie asynchronicznych aplikacja może kontynuować z innych prac, które nie zależą od zasobu sieci web przed zakończeniem zadania potencjalnie blokującym.
W poniższej tabeli przedstawiono typowe obszary, gdzie Programowanie asynchronicznego poprawia czas odpowiedzi.Wymienione interfejsów API z .NET Framework 4.5 i Środowisko wykonawcze systemu Windows zawiera metody, które obsługują programowanie komunikacji asynchronicznej.
Obszar aplikacji |
Wspieranie interfejsów API, które zawierają metody komunikacji asynchronicznej |
---|---|
Dostęp w sieci Web |
|
Praca z plikami |
|
Praca z obrazami |
|
Programowania WCF |
|
Praca z gniazdami |
Asynchrony okaże się wyjątkowo przydatne w przypadku aplikacji, które dostępu wątku interfejsu użytkownika, ponieważ wszystkie działania związane z interfejsu użytkownika zazwyczaj współużytkuje jeden wątek.Jeśli jakikolwiek proces jest zablokowany w aplikacji synchroniczne, wszystkie są zablokowane.Aplikacja przestaje odpowiadać i może stwierdzić, że go nie gdy zamiast tego jest po prostu oczekiwanie.
Korzystając z metod asynchronicznych, aplikacji nadal reagować na interfejsie użytkownika.Można zmienić rozmiar lub zminimalizować okno, na przykład, lub można zamknąć aplikację, jeśli nie chcesz czekać na zakończenie.
Podejścia opartego na asynchroniczne dodaje odpowiednik automatyczną skrzynią biegów do listy opcji, które można wybrać podczas projektowania operacji asynchronicznych.Oznacza to można uzyskać wszystkie zalety tradycyjnych asynchronicznego programowania, ale przy znacznie mniejszym nakładzie pracy od autora.
Metody komunikacji asynchronicznej są łatwiejsze do zapisu
Asynchroniczne i oczekiwać słowa kluczowe w języku Visual Basic i asynchroniczne i czekają na słowa kluczowe w języku C# są serce programowania komunikacji asynchronicznej.Korzystając z tych dwóch słów kluczowych, można korzystać z zasobów w.NET Framework lub Środowisko wykonawcze systemu Windows do tworzenia niemal równie łatwo, jak utworzyć synchroniczne metodę metod asynchronicznych.Asynchroniczne metody, które definiuje się za pomocą transmisji asynchronicznej i czekają na są określane jako metody komunikacji asynchronicznej.
W poniższym przykładzie przedstawiono metodę komunikacji asynchronicznej.Prawie wszystko w kodzie powinna wyglądać całkowicie znana użytkownikom.Komentarze wywołać funkcje, które dodajesz do tworzenia asynchrony.
W pliku Kompletny przykład na końcu tego tematu można znaleźć i pobrać próbki z próbki asynchroniczne: przykład z "Asynchronicznego programowania za pomocą transmisji asynchronicznej i czekają na".
' 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 jeszcze żadnej pracy, że może to zrobić między telefonicznej GetStringAsync i oczekiwania na jego zakończenia, można uprościć kodzie wywołując i oczekujące na w następujących zapytaniu.
Dim urlContents As String = Await client.GetStringAsync()
string urlContents = await client.GetStringAsync();
Charakterystyka podsumowanie, co sprawia, że poprzedni przykład metodę komunikacji asynchronicznej.
Podpis metody zawiera Async lub async modyfikator.
Nazwa metody komunikacji asynchronicznej, zwyczajowo, kończy się z sufiksem "Async".
Typ zwracany jest jedną z następujących typów:
Task<TResult>Jeśli metoda zawiera instrukcję return, w którym operand ma typ TResult.
TaskJeśli Twoja forma ma nie instrukcji return lub ma instrukcję return z nie operandu.
Void ( Sub w języku Visual Basic) przy pisaniu pracy program obsługi zdarzeń asynchronicznych.
Aby uzyskać więcej informacji zobacz "Powrócić typy parametrów i" w dalszej części tego tematu.
Metoda zazwyczaj zawiera co najmniej jedną czekają na wyrażenie, które stanowi punkt, w przypadku gdy metoda kontynuacja nie jest oczekiwany operacja asynchroniczna została zakończona.W międzyczasie metoda jest zawieszony i zwraca sterowania do wywołania tej metody.Następnej sekcji w tym temacie przedstawiono, co się dzieje w momencie zawieszenia.
W metodach komunikacji asynchronicznej Aby określić, co chcesz zrobić należy użyć słowa kluczowe, pod warunkiem i typów, a kompilator zajmie się resztą, w tym śledzenie co musi się zdarzyć, gdy sterowania zwraca się z punktem oczekiwać w metodzie zawieszonych.Niektóre procesy rutynowych, takich jak pętle i obsługa wyjątków może być utrudnione w tradycyjnych asynchronicznego kodu.W metody asynchronicznej piszesz te elementy tyle, ile będzie w roztworze synchronicznych i jego rozwiązania.
Aby uzyskać więcej informacji na temat asynchrony w poprzednich wersjach systemu.NET Framework, zobacz TPL i tradycyjnych.NET programowania asynchroniczne.
Co się dzieje w metodę komunikacji asynchronicznej
Najważniejszą rzeczą do zrozumienia w programowanie asynchronicznego jest, jak przepływ sterowania przenosi metoda metoda.Poniższy diagram poprowadzi Cię przez proces.
Numery na diagramie odpowiadają następujące kroki.
Program obsługi zdarzeń wywołuje i czeka na AccessTheWebAsync metody asynchronicznej.
AccessTheWebAsyncTworzy HttpClient wystąpienie i wywołania GetStringAsync metod asynchronicznych na pobranie zawartości witryny sieci Web jako ciąg.
Coś się stanie w GetStringAsync który wstrzymuje jego postęp.Być może musi czekać na stronie internetowej do pobrania lub innej działalności blokującym.Aby uniknąć blokowania zasobów, GetStringAsync daje w wyniku kontroli do miejsca wywołania AccessTheWebAsync.
GetStringAsyncZwraca Task<TResult> w przypadku, gdy TResult jest ciągiem, a AccessTheWebAsync przypisuje zadania, getStringTask zmiennej.Zadanie reprezentuje ciągły proces wywołanie GetStringAsync, z zobowiązaniem do produkcji rzeczywistą wartością ciągu po zakończeniu pracy.
Ponieważ getStringTask nie został jeszcze, oczekiwany AccessTheWebAsync można kontynuować pracę z innych prac, który nie zależy od wyniku końcowego z GetStringAsync.Że praca jest reprezentowany przez wywołanie metody synchroniczne DoIndependentWork.
DoIndependentWorkjest to metoda synchroniczne, które powoduje jego pracy i zwraca do miejsca wywołania.
AccessTheWebAsyncza mało pracy, że może to zrobić bez wyniku od getStringTask.AccessTheWebAsyncdalej chce obliczyć i wielkość ciąg pobrany, ale metoda nie może obliczyć tę wartość, do momentu metoda ma ciąg.
W związku z tym AccessTheWebAsync używa operator oczekiwać, aby zawiesić jego postęp i wydajność sterowania do metody, która wywołała AccessTheWebAsync.AccessTheWebAsyncZwraca Task(Of Integer) lub Task<int> do obiektu wywołującego.Zadanie reprezentuje promise do uzyskania wyniku liczbą całkowitą, to długość ciągu pobrany.
[!UWAGA]
Jeśli GetStringAsync (i w związku z tym getStringTask) została zakończona przed AccessTheWebAsync czeka, kontroli pozostałości w AccessTheWebAsync.Koszt zawieszenia, a następnie powrót do AccessTheWebAsync Marne, gdyby proces asynchroniczny o nazwie (getStringTask) została już sfinalizowana i AccessTheWebSync nie musi czekać na wynik końcowy.
Wewnątrz rozmówcę (Obsługa zdarzeń w tym przykładzie) proces ten jest powtarzany.Obiekt wywołujący może być wykonywanie innych czynności, która nie polega w związku z AccessTheWebAsync przed oczekiwania na wynik lub abonenta wywołującego może czekać natychmiast.Gdy obsługa zdarzeń osiągnie wyrażenie oczekiwać, aplikacja koncentruje się na zakończeniu GetStringAsync.Obsługa zdarzeń jest oczekiwanie na AccessTheWebAsync, i AccessTheWebAsync czeka na GetStringAsync.
GetStringAsynckończy, a czego wynikiem jest ciąg.Wynik ciąg nie jest zwracany przez wywołanie GetStringAsync w sposób, że można się spodziewać.(Należy pamiętać, że metoda zwróciła już zadania w kroku 3). Zamiast tego, wynik ciąg jest przechowywany w zadanie, które reprezentuje zakończenie metody, getStringTask.Operator oczekiwać pobiera w związku z getStringTask.Instrukcja przypisania przypisuje wynik zostały pobrane z urlContents.
Gdy AccessTheWebAsync wynik to ciąg znaków, metoda można obliczyć długość ciągu.To praca AccessTheWebAsync również zostanie zakończona, i obsługi zdarzeń oczekiwania może być wznowiona.W pełny przykład na koniec tematu można potwierdzić, że program obsługi zdarzeń pobiera i wyświetlenia wartości wyniku długości.
Jeśli jesteś nowym do asynchronicznego programowania, Poświęć chwilę, aby wziąć pod uwagę różnicę między zachowanie synchroniczne i asynchroniczne.Metoda synchronicznego zwraca wartość, gdy jego praca jest pełny (krok 5), ale metoda async zwraca wartość zadania podczas swojej pracy jest zawieszone (kroki 3 i 6).Po zakończeniu metody asynchronicznej po pewnym czasie jego pracy, zadanie jest oznaczone jako ukończone i wyników, jeśli w ogóle, jest przechowywana w zadaniu.
Aby uzyskać więcej informacji na temat przepływ sterowania, zobacz Przepływ sterowania w programach Async (C# i Visual Basic).
Metody interfejsu API Async
Można się zastanawiać gdzie szukać metod, takich jak GetStringAsync że programowanie async pomocy technicznej..NET Framework 4.5 Zawiera wielu członków, które działają z asynchroniczne i czekają na.Można rozpoznać tych członków sufiks "Async", który jest dołączony do nazwę i typ zwracany z Task lub Task<TResult>.Na przykład klasa System.IO.Stream zawiera metody, takie jak CopyToAsync, ReadAsync, i WriteAsync obok synchroniczne metody CopyTo, Read, i Write.
Środowisko wykonawcze systemu Windows Zawiera również wiele metod, które można używać z asynchroniczne i czekają w Windows Store aplikacji.Aby uzyskać więcej informacji i przykład metody, zobacz Szybki Start: za pomocą operatora oczekiwać dla asynchronicznego programowania,, asynchroniczno programowania (Sklep Windows aplikacje), i WhenAny: łączenie platformy .NET Framework ze środowiskiem wykonawczym systemu Windows (C# i Visual Basic).
Wątki
Metody komunikacji asynchronicznej powinny być, bez blokowania operacji.Wyrażenie oczekiwać w metodę komunikacji asynchronicznej nie blokuje bieżącego wątku, podczas gdy oczekiwany zadanie jest uruchomione.Zamiast tego wyrażenie rejestruje się w pozostałej części metody jako kontynuacja i zwraca sterowanie do obiektu wywołującego metodę komunikacji asynchronicznej.
Asynchroniczne i czekają na słowa kluczowe nie powodują dodatkowe wątki, które ma zostać utworzony.Metody komunikacji asynchronicznej nie wymagają wielowątkowości, ponieważ metody asynchronicznej nie działa na swój własny wątek.Metoda działa na bieżący kontekst synchronizacji i używa czasu w wątku, tylko wtedy, gdy metoda jest aktywny.Można użyć Task.Run Aby przenieść wątek w tle, ale tła pracy procesora wątek nie pomaga z procesem, który jest po prostu oczekiwaniem na wyniki, stanie się dostępne.
Preferowane istniejących założeń prawie w każdym przypadku jest podejście oparte na komunikacji asynchronicznej do asynchronicznego programowania.W szczególności, takie podejście jest lepszy niż BackgroundWorker dla operacji We/Wy ze schematem operacji, ponieważ kod jest prostsze i nie masz zabezpieczyć się przed sytuacje wyścigów.W połączeniu z Task.Run, Programowanie komunikacji asynchronicznej jest lepszy niż BackgroundWorker dla procesora operacji ponieważ Programowanie async oddziela szczegóły koordynacji zainstalowany kodu z pracy, który Task.Run transfery do puli wątków.
Asynchroniczne i czekają na
Jeśli określisz, że metoda jest metodą komunikacji asynchronicznej, za pomocą asynchroniczne lub asynchroniczne modyfikator, włączyć następujące dwie funkcje.
Można użyć metody asynchronicznej oznaczone oczekiwać lub czekają na na wyznaczenie punktów zawieszenia.Operator oczekiwać nakazuje kompilatorowi metody asynchronicznej, kontynuacja poza tym punktem nie jest oczekiwany asynchronicznego proces się zakończy.W międzyczasie zwraca sterowania do wywołującego metody asynchronicznej.
Zawieszenie to metoda komunikacji asynchronicznej, w wyrażeniach oczekiwać nie stanowi wyjście z metody, i finally bloków nie działają.
Metody asynchronicznej oznaczonego może sam być oczekiwany metodami, które nazywamy go.
Metody asynchronicznej zazwyczaj zawiera jedno lub więcej wystąpień operatora oczekiwać, ale brak wyrażenia oczekiwać nie powoduje błąd kompilatora.Jeśli metody asynchronicznej nie używa operatora oczekiwać znaku punkt zawieszenia, metodę wykonuje, podobnie jak metoda synchronicznego, pomimo modyfikator komunikacji asynchronicznej.Kompilator generuje ostrzeżenie dla takich metod.
Async, async, Await, and await are contextual keywords.Aby uzyskać więcej informacji i przykłady zobacz następujące tematy:
Zwracanymi typami i parametry
W programowaniu.NET Framework, zwykle zwraca metodę komunikacji asynchronicznej Task lub Task<TResult>.Wewnątrz metody asynchronicznej operator oczekiwać jest stosowany do zadania, który jest zwracany z innej metody komunikacji asynchronicznej.
Określisz Task<TResult> jako typ zwracany, jeśli metoda zawiera powrócić (Visual Basic) lub zwrotu (C#) instrukcja, która określa operandu typu TResult.
Możesz użyć Task jako typu zwrotnego metody ma instrukcję return, która nie zwraca argument lub ma nie instrukcji return.
W poniższym przykładzie pokazano, jak zadeklarować i wywołać metodę, która zwraca Task<TResult> 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();
Przed poszczególnymi zwracanymi reprezentuje zadanie pracy w toku.Zadanie zawiera informacje o stanie procesu asynchronicznego i, ostatecznie, albo wynik końcowy z procesu lub wyjątek, który wywołuje proces, jeśli nie uda.
Można także metody asynchronicznej Sub metoda (Visual Basic) lub void zwracany typ (C#).To zwraca typ służy przede wszystkim do definiowania programy obsługi zdarzeń, gdzie void zwracany typ jest wymagane.Programy obsługi zdarzeń asynchronicznych często służą jako punkt wyjścia dla programów komunikacji asynchronicznej.
Metoda async to Sub procedury lub który ma void zwrotu nie może być oczekiwany typ, a obiekt wywołujący metodę zwracanie void nie może przechwycić wszelkie wyjątki, które metoda wygeneruje.
Nie można zadeklarować metody asynchronicznej ByRef parametrów w języku Visual Basic lub ref lub się parametrów w C#, ale metodę można wywołać metody, które mają takie parametry.
Aby uzyskać dodatkowe informacje i przykłady, zobacz Typy zwrotu Async (C# i Visual Basic).Aby uzyskać więcej informacji o sposobach przechwytywać wyjątków w metodach asynchronicznych, zobacz try-catch (C# odniesienia) lub Spróbuj...Catch...Instrukcja finally (Visual Basic).
Asynchroniczne API w Środowisko wykonawcze systemu Windows programowania pełnić jedną z następujących typów zwrotu, które są podobne do zadań:
IAsyncOperation, która odnosi się doTask<TResult>
IAsyncAction, która odnosi się doTask
Aby uzyskać więcej informacji i przykładem, zobacz Szybki Start: za pomocą operatora oczekiwać dla asynchronicznego programowania,.
Konwencja nazewnictwa
Umownie, można dodać "Async" nazwy metod, które mają Async lub async modyfikator.
Można zignorować Konwencji, gdzie zdarzeń, umowy interfejsu lub klasa podstawowa sugeruje inną nazwę.Na przykład, nie należy zmienisz wspólne programy obsługi zdarzeń, takich jak Button1_Click.
Tematy pokrewne
Tytuł |
Opis |
Próbki |
---|---|---|
Instruktaż: Dostęp do sieci Web za pomocą transmisji asynchronicznej i poczekać (C# i Visual Basic) |
Pokazuje sposób konwertowania synchroniczne roztwór WPF do asynchronicznego roztworu WPF.Aplikacja pobiera serii witryn sieci Web. |
Komunikacji asynchronicznej próbki: Przewodnik po składnikach Web (C# i Visual Basic) dostęp |
Jak: rozszerzenie Instruktaż przy użyciu Task.WhenAll (C# i Visual Basic) |
Dodaje Task.WhenAll do poprzedniego instruktażu.Użycie WhenAll uruchamia wszystkie pliki do pobrania w tym samym czasie. |
|
Jak: tworzenie wielu sieci Web żądania równolegle (C# i Visual Basic) |
Pokazuje, jak uruchomić kilka zadań w tym samym czasie. |
Próbka asynchroniczne: Generowanie żądań wielu sieci Web równolegle (C# i Visual Basic) |
Pokazuje typy zwracające metody komunikacji asynchronicznej i wyjaśnia, kiedy każdy typ jest odpowiedni. |
||
Służy do śledzenia szczegółowo przepływ sterowania przez kolejnych czekają na wyrażeń w dowolnym programie asynchronicznego. |
Próbka asynchroniczne: Przepływ sterowania w programach Async (C# i Visual Basic) |
|
Pokazuje, jak dodać następujące funkcje do rozwiązania komunikacji asynchronicznej: |
Próbka asynchroniczne: Dobrze dostrajania aplikacji (C# i Visual Basic) |
|
Obsługa ponownego rozpoczęcia w aplikacjach asynchronicznych (C# i Visual Basic) |
Pokazuje, jak obsługiwać przypadki, w których po ponownym uruchomieniu active operacja asynchroniczna jest uruchomiona. |
|
Pokazuje, jak mostki między typy zadań w.NET Framework i IAsyncOperations w Środowisko wykonawcze systemu Windows , dzięki czemu można użyć WhenAny z Środowisko wykonawcze systemu Windows metoda. |
Próbka asynchroniczne: Pomostu między .NET i program obsługi systemu Windows (AsTask i WhenAny) |
|
Pokazuje, jak mostki między typy zadań w.NET Framework i IAsyncOperations w Środowisko wykonawcze systemu Windows , dzięki czemu można użyć CancellationTokenSource z Środowisko wykonawcze systemu Windows metoda. |
Próbka asynchroniczne: Pomostu między .NET i program obsługi systemu Windows (AsTask & Anulowanie) |
|
Użycie Async do uzyskiwania dostępu do plików (C# i Visual Basic) |
Wyświetla listę i pokazuje korzyści z używania asynchroniczne i czekają na dostęp do plików. |
|
Przedstawia przepływ sterowania w instrukcji oczekiwać oraz przedstawiono zachowanie Step Into, Kroku nad, i Step Out poleceń w ramach metod komunikacji asynchronicznej. |
||
W tym artykule opisano nowy deseń dla asynchrony w.NET Framework.Deseń jest oparty na Task i Task<TResult> typów. |
||
Szybki Start: Wywołanie asynchroniczne interfejsów API w języku C# lub Visual Basic |
Pokazuje sposób używania asynchroniczne i czekają w Windows Store aplikacji. |
|
Zawiera omówienie asynchronicznego programowania w Środowisko wykonawcze systemu Windows. |
||
Zawiera łącza do różnych plików wideo o programowaniu komunikacji asynchronicznej. |
Kompletny przykład
Następujący kod to plik MainWindow.xaml.vb lub MainWindow.xaml.cs z aplikacji Windows Presentation Foundation (WPF), która w tym temacie omówiono.Można pobrać próbki z próbki asynchroniczne: przykład z "Asynchronicznego programowania za pomocą transmisji asynchronicznej i czekają na".
' 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
Asynchroniczne (C# odniesienia)