Sdílet prostřednictvím


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

Operátor await se použije na úkol v asynchronní metodě k pozastavení provádění metody až do dokončení očekávaného úkolu.Úloha představuje probíhající práci.

Asynchronní metoda, ve které se používá await, musí být upravena klíčovým slovem asynchronní.Tato metoda, definována pomocí modifikátoru async, a obvykle obsahuje jeden nebo více výrazů await, které jsou označovány jako asynchronní metoda.

[!POZNÁMKA]

Klíčová slova async a await byla zavedena v aplikaci Visual Studio 2012.Úvod do asynchronního programování naleznete zde: Asynchronní programování pomocí modifikátoru Async a operátoru Await (C# a Visual Basic).

Úkol, na který je použit operátor await, je vrácená hodnota z volání metody, která implementuje je obvykle asynchronní zpracování úloh.Příklady zahrnují hodnoty typu Task nebo Task.

V následujícím kódu metoda HttpClientGetByteArrayAsync vrátí Task<byte[]>, getContentsTask.Úkol je příslib z k vytvoření pole bajtů po dokončení úkolu.Operátor await je použit na getContentsTask k pozastavení provádění v SumPageSizesAsync až do dokončení getContentsTask.Mezitím se ovládací prvek vrátí volajícímu metody SumPageSizesAsync.Když je getContentsTask dokončeno, výraz await je vyhodnocen jako bajtové pole.

private async Task SumPageSizesAsync()
{
    // To use the HttpClient type in desktop apps, you must include a using directive and add a 
    // reference for the System.Net.Http namespace.
    HttpClient client = new HttpClient();
    // . . .
    Task<byte[]> getContentsTask = client.GetByteArrayAsync(url);
    byte[] urlContents = await getContentsTask;

    // Equivalently, now that you see how it works, you can write the same thing in a single line.
    //byte[] urlContents = await client.GetByteArrayAsync(url);
    // . . .
}
Důležitá poznámkaDůležité

Úplný příklad naleznete v tématu Návod: Přístup k webu pomocí modifikátoru Async a operátoru Await (C# a Visual Basic).Ukázku si můžete stáhnout na stránkách Ukázky kódu vývojáře na webu společnosti Microsoft.Příklad je v projektu AsyncWalkthrough_HttpClient.

Jak je zobrazeno v předchozím příkladu, pokud se aplikuje await na výsledek volání metody, která vrací Task<TResult>, potom je typ výrazu await TResult.Pokud se aplikuje await na výsledek volání metody, která vrací Task, potom je typ výrazu await „void“.Rozdíl je znázorněn v následujícím příkladu.

// Keyword await used with a method that returns a Task<TResult>.
TResult result = await AsyncMethodThatReturnsTaskTResult();

// Keyword await used with a method that returns a Task.
await AsyncMethodThatReturnsTask();

Výraz await neblokuje vlákno, ve kterém je spuštěn.Místo toho způsobí, že kompilátor zapíše zbytek asynchronní metody jako pokračování očekávané úlohy.Ovládací prvek se poté vrátí volajícímu asynchronní metody.Po dokončení úkolu vyvolá jeho pokračování a provádění asynchronní metody pokračuje, kde přestalo.

K výrazu await může dojít pouze v těle těsně uzavírajícím metodu, lambda výraz nebo anonymní metodu označenou modifikátorem async.Termín await slouží jako klíčové slovo pouze v tomto kontextu.Jinde je interpretován jako identifikátor.V rámci této metody, výrazu lambda nebo anonymní metody se nesmí výraz await objevit v těle synchronní zprávy, ve výrazu dotazu, v nebo catchfinally bloku výrazu zpracování výjimky, v bloku výrazu uzamknutí nebo v nebezpečném kontextu.

Výjimky

Většina asynchronních metod vrátí Task nebo Task.Vlastnosti vrácené úlohy nesou informaci o jejím stavu a historii, např. zda je úkol dokončen, zda asynchronní metoda způsobila výjimku nebo byla zrušena a co je konečný výsledek.Operátor await má přístup k těmto vlastnostem.

Pokud očekáváte metodu vracející asynchronní úlohu, která způsobí výjimku, operátor await vyvolá výjimku znovu.

Pokud očekáváte metodu vracející asynchronní úlohu, která je zrušena, operátor await znovu vyvolá výjimku OperationCanceledException.

Jediný úkol, který je v chybovém stavu, může odrážet více výjimek.Úkol může být například výsledek volání do Task.WhenAll.Když budete očekávat takový úkol, operace await vrátí pouze jednu z výjimek.Nelze však předpovědět, které výjimky budou znovu vyvolány.

Příklady zpracování chyb v asynchronních metodách naleznete zde: try-catch (Referenční dokumentace jazyka C#).

Příklad

Následující příklad Windows Forms ukazuje použití await v asynchronní metodě, WaitAsynchronouslyAsync.Kontrast v chování dané metody s chováním WaitSynchronously.Bez použití operátoru await u určitého úkolu WaitSynchronously pracuje synchronně navzdory použití async modifikátoru v definici a volání Thread.Sleep v těle.

private async void button1_Click(object sender, EventArgs e)
{
    // Call the method that runs asynchronously.
    string result = await WaitAsynchronouslyAsync();

    // Call the method that runs synchronously.
    //string result = await WaitSynchronously ();

    // Display the result.
    textBox1.Text += result;
}

// The following method runs asynchronously. The UI thread is not
// blocked during the delay. You can move or resize the Form1 window 
// while Task.Delay is running.
public async Task<string> WaitAsynchronouslyAsync()
{
    await Task.Delay(10000);
    return "Finished";
}

// The following method runs synchronously, despite the use of async.
// You cannot move or resize the Form1 window while Thread.Sleep
// is running because the UI thread is blocked.
public async Task<string> WaitSynchronously()
{
    // Add a using directive for System.Threading.
    Thread.Sleep(10000);
    return "Finished";
}

Viz také

Úkoly

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

Referenční dokumentace

async (Referenční dokumentace jazyka C#)

Koncepty

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