Sdílet prostřednictvím


async (Referenční dokumentace jazyka C#)

Pomocí modifikátoru async určíte, aby metoda, výraz lambda nebo anonymní metoda byly asynchronní.Pokud použijete tento modifikátor na metodu nebo výraz, označuje se jako asynchronní metoda.

public async Task<int> ExampleMethodAsync()
{
    // . . . .
}

Pokud asynchronní programování provádíte poprvé nebo jste neporozuměli, jakým způsobem asynchronní metoda používá klíčové slovo await pro potenciálně dlouhotrvající práci bez blokování vlákna volajícího, měli byste si přečíst úvod v kapitole Asynchronní programování pomocí modifikátoru Async a operátoru Await (C# a Visual Basic).

string contents = await contentsTask;

Metoda pracuje synchronně, dokud nedosáhne prvního výrazu await. V tomto okamžiku je metoda pozastavena, dokud není dokončen očekávaný úkol.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 async upravuje, neobsahuje výraz nebo příkaz await, je metoda provedena synchronně.Upozornění kompilátoru vás upozorní na jakékoli asynchronní metody, které neobsahují slovo await, protože tato situace může značit chybu.Další informace naleznete v tématu Upozornění kompilátoru (úroveň 1) CS4014.

Klíčové slovo async se řídí podle kontextu do té míry, že se chová jako klíčové slovo pouze v případě, že upravuje 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 znázorňuje strukturu a tok řízení mezi asynchronním ovladačem událostí StartButton_Click a asynchronní metodou ExampleMethodAsync.Výsledkem asynchronní metody je délka stažené webové stránky.Kód je vhodný pro aplikaci Windows Presentation Foundation (WPF) nebo aplikaci Windows Store, kterou jste vytvořili v rámci Visual Studio 2013; informace o nastavení aplikace najdete v komentářích ke kódu.

// You can run this code in Visual Studio 2013 as a WPF app or a Windows Store app.
// You need a button (StartButton) and a textbox (ResultsTextBox).
// Remember to set the names and handler so that you have something like this:
// <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="TextBox" VerticalAlignment="Top" Width="310" Name="ResultsTextBox"/>
        
// To run the code as a WPF app:
//    paste this code into the MainWindow class in MainWindow.xaml.cs,
//    add a reference to System.Net.Http, and
//    add a using directive for System.Net.Http.

// To run the code as a Windows Store app:
//    paste this code into the MainPage class in MainPage.xaml.cs, and
//    add using directives for System.Net.Http and 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}\n", length);
    }
    catch (Exception)
    {
        // Process the exception if one occurs.
    }
}

public async Task<int> ExampleMethodAsync()
{
    var httpClient = new HttpClient();
    int exampleInt = (await httpClient.GetStringAsync("https://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;
}
// Output:
// Preparing to finish ExampleMethodAsync.
// Length: 53292
Důležitá poznámkaDůležité

Další informace o úkolech a kódu, který se spustí při čekání na úlohy, naleznete v tématu Asynchronní programování pomocí modifikátoru Async a operátoru Await (C# a Visual Basic). Úplný příklad WPF s využitím obdobných prvků naleznete v tématu Návod: Přístup k webu pomocí modifikátoru Async a operátoru Await (C# a Visual Basic).Můžete si stáhnout instruktážní kód z tématu Ukázky kódu vývojáře.

Návratové typy

Asynchronní metoda může mít návratový typ Task, Task nebo void.Metoda nemůže deklarovat všechny parametry ref nebo out, ale může volat metody, které mají tyto parametry.

Zadáte Task<TResult> jako návratový typ asynchronní metody, pokud příkaz return metody určuje operand typu TResult.Můžete použít Task, pokud není vrácena žádná smysluplná hodnota po dokončení metody.To znamená, že volání metody vrací klíčové slovo Task, pokud je však klíčové slovo Task dokončeno, všechny výrazy await čekající na klíčové slovo Task jsou vyhodnoceny jako klíčové slovo void.

Použijete typ vrácení void především k definování ovladačů událostí, kde je požadován návratový typ.Volající asynchronní metody, kteří vracejí hodnotu void, na ni nemohou čekat a zaznamenat tak výjimky, které metoda vyvolá.

Další informace a příklady naleznete v tématu Asynchronní návratové typy (C# and Visual Basic).

Viz také

Úkoly

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

Referenční dokumentace

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

AsyncStateMachineAttribute

Koncepty

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