async (Referenční dokumentace jazyka C#)
asyncModifikátor použijte k určení, že metoda, výraz lambdanebo anonymní metoda je asynchronní. Pokud tento modifikátor použijete u metody nebo výrazu, označuje se jako asynchronní metoda. Následující příklad definuje asynchronní metodu s názvem ExampleMethodAsync :
public async Task<int> ExampleMethodAsync()
{
//...
}
Pokud s asynchronním programováním ještě nepracujete nebo await nerozumíte tomu, jak asynchronní metoda používá operátor k potenciálně dlouhotrační práci bez blokování vlákna volajícího, přečtěte si úvod do tématu Asynchronní programování s modifikátorem async a await. Následující kód se nachází uvnitř asynchronní metody a volá HttpClient.GetStringAsync metodu :
string contents = await httpClient.GetStringAsync(requestUrl);
Asynchronní metoda se spouští synchronně, dokud nedosáhne svého prvního výrazu, kdy je metoda pozastavena, dokud není await dokončena čekající úloha. Během této doby se ovládací prvek vrátí volajícímu metody, stejně jako v příkladu v následující části.
Pokud metoda, kterou klíčové slovo upravuje, neobsahuje výraz nebo async await příkaz, metoda se provede synchronně. Upozornění kompilátoru vás upozorní na všechny asynchronní metody, které neobsahují příkazy, protože tato situace await může znamenat chybu. Viz Upozornění kompilátoru (úroveň 1) CS4014.
Klíčové slovo je kontextové v tom, že se jedná o klíčové slovo pouze v případě, že upravuje async metodu, výraz lambda nebo anonymní metodu. Ve všech ostatních kontextech je interpretováno jako identifikátor.
Příklad
Následující příklad ukazuje strukturu a tok řízení mezi asynchronní obslužnou rutinou události a StartButton_Click asynchronní metodou ExampleMethodAsync . Výsledkem asynchronní metody je počet znaků webové stránky. Kód je vhodný pro aplikaci Windows Presentation Foundation (WPF) nebo Windows Store, kterou vytvoříte v Visual Studio. podívejte se na komentáře ke kódu pro nastavení aplikace.
Tento kód můžete spustit v Visual Studio jako Windows Presentation Foundation (WPF) nebo jako Windows Store. Potřebujete ovládací prvek Tlačítko s názvem StartButton a ovládací prvek Textové pole s názvem ResultsTextBox . Nezapomeňte nastavit názvy a obslužnou rutinu tak, abyste měli něco podobného:
<Button Content="Button" HorizontalAlignment="Left" Margin="88,77,0,0" VerticalAlignment="Top" Width="75"
Click="StartButton_Click" Name="StartButton"/>
<TextBox HorizontalAlignment="Left" Height="137" Margin="88,140,0,0" TextWrapping="Wrap"
Text="<Enter a URL>" VerticalAlignment="Top" Width="310" Name="ResultsTextBox"/>
Spuštění kódu jako aplikace WPF:
- Vložte tento kód do
MainWindowtřídy v MainWindow.xaml.cs. - Přidejte odkaz na System.Net.Http.
- Přidejte
usingdirektivu pro System.Net.Http.
Spuštění kódu jako aplikace Windows Store:
- Vložte tento kód do
MainPagetřídy v souboru MainPage.xaml.cs. - Přidejte direktivy using pro System.Net.Http a System.Threading.Tasks.
private async void StartButton_Click(object sender, RoutedEventArgs e)
{
// ExampleMethodAsync returns a Task<int>, which means that the method
// eventually produces an int result. However, ExampleMethodAsync returns
// the Task<int> value as soon as it reaches an await.
ResultsTextBox.Text += "\n";
try
{
int length = await ExampleMethodAsync();
// Note that you could put "await ExampleMethodAsync()" in the next line where
// "length" is, but due to when '+=' fetches the value of ResultsTextBox, you
// would not see the global side effect of ExampleMethodAsync setting the text.
ResultsTextBox.Text += String.Format("Length: {0:N0}\n", length);
}
catch (Exception)
{
// Process the exception if one occurs.
}
}
public async Task<int> ExampleMethodAsync()
{
var httpClient = new HttpClient();
int exampleInt = (await httpClient.GetStringAsync("http://msdn.microsoft.com")).Length;
ResultsTextBox.Text += "Preparing to finish ExampleMethodAsync.\n";
// After the following return statement, any method that's awaiting
// ExampleMethodAsync (in this case, StartButton_Click) can get the
// integer result.
return exampleInt;
}
// The example displays the following output:
// Preparing to finish ExampleMethodAsync.
// Length: 53292
Důležité
Další informace o úlohách a kódu, který se provádí při čekání na úlohu, najdete v tématu Asynchronní programování pomocí modifikátoru Asynca operátoru Await . Úplný příklad konzoly, který používá podobné prvky, najdete v tématu Zpracování asynchronních úloh po jejich dokončení (C#).
Návratové typy
Asynchronní metoda může mít následující návratové typy:
- Task
- Task<TResult>
- void.
async voidMetody se obecně nedoporučuje používat pro jiný kód než obslužné rutiny událostí, protože volající nemohou tyto metody a musí implementovat jiný mechanismus pro hlášení úspěšných dokončeníawaitnebo chybových podmínek. - Počínaje jazykem C# 7.0 je libovolný typ, který má přístupnou
GetAwaitermetodu. TypSystem.Threading.Tasks.ValueTask<TResult>je jednou z takových implementací. Je k dispozici přidáním balíčku NuGetSystem.Threading.Tasks.Extensions.
Asynchronní metoda nemůže deklarovat žádné parametry v parametrech , ref nebo out, aninemůže mít návratovou hodnotu odkazu, ale může volat metody, které mají tyto parametry.
Jako návratový typ asynchronní metody určíte, pokud příkaz return metody určuje Task<TResult> operand typu TResult . TaskPoužijete, pokud po dokončení metody není vrácena žádná smysluplná hodnota. To znamená, že volání metody vrátí , ale po dokončení se libovolný výraz, který čeká na , Task Task vyhodnotí jako await Task void .
Návratový typ void se používá především k definování obslužných rutin událostí, které vyžadují tento návratový typ. Volající asynchronní metody -vracející ji nemůže očekávat a nemůže zachytit výjimky, které void metoda vyvolá.
Počínaje jazykem C# 7.0 vrátíte jiný typ, obvykle hodnotový typ, který má metodu pro minimalizaci přidělení paměti v oddílech kódu, které jsou kritické GetAwaiter pro výkon.
Další informace a příklady najdete v tématu Asynchronní návratové typy.