operátor await – asynchronně čeká na dokončení úkolu
Operátor await
pozastaví vyhodnocení ohraničující asynchronní metody, dokud se asynchronní operace reprezentovaná jeho operandem nedokončí. Po dokončení await
asynchronní operace vrátí operátor výsledek operace, pokud existuje. await
Pokud je operátor použit na operand, který představuje již dokončenou operaci, vrátí výsledek operace okamžitě bez pozastavení ohraničující metody. Operátor await
neblokuje vlákno, které vyhodnocuje asynchronní metodu. await
Když operátor pozastaví uzavřenou asynchronní metodu, ovládací prvek se vrátí volající metodě.
V následujícím příkladu HttpClient.GetByteArrayAsync metoda vrátí Task<byte[]>
instanci, která představuje asynchronní operaci, která po dokončení vytvoří pole bajtů. Dokud operace nebude dokončena, await
operátor pozastaví metodu DownloadDocsMainPageAsync
. Když DownloadDocsMainPageAsync
se pozastaví, ovládací prvek se vrátí do Main
metody, což je volající .DownloadDocsMainPageAsync
Metoda Main
se provede, dokud nebude potřebovat výsledek asynchronní operace prováděné metodou DownloadDocsMainPageAsync
. Když GetByteArrayAsync získá všechny bajty, zbytek DownloadDocsMainPageAsync
metody se vyhodnotí. Potom se vyhodnotí zbytek Main
metody.
public class AwaitOperator
{
public static async Task Main()
{
Task<int> downloading = DownloadDocsMainPageAsync();
Console.WriteLine($"{nameof(Main)}: Launched downloading.");
int bytesLoaded = await downloading;
Console.WriteLine($"{nameof(Main)}: Downloaded {bytesLoaded} bytes.");
}
private static async Task<int> DownloadDocsMainPageAsync()
{
Console.WriteLine($"{nameof(DownloadDocsMainPageAsync)}: About to start downloading.");
var client = new HttpClient();
byte[] content = await client.GetByteArrayAsync("https://learn.microsoft.com/en-us/");
Console.WriteLine($"{nameof(DownloadDocsMainPageAsync)}: Finished downloading.");
return content.Length;
}
}
// Output similar to:
// DownloadDocsMainPageAsync: About to start downloading.
// Main: Launched downloading.
// DownloadDocsMainPageAsync: Finished downloading.
// Main: Downloaded 27700 bytes.
Operand výrazu await
musí poskytovat oznámení po dokončení úkolu. Obecně platí, že delegát je vyvolán při dokončení úkolu, a to buď úspěšně, nebo neúspěšně. Část await
specifikace jazyka C# obsahuje podrobnosti o způsobu implementace těchto oznámení.
Předchozí příklad používá asynchronní metodu.Main
Další informace naleznete v operátoru await v části Main metoda .
Poznámka:
Úvod do asynchronního programování naleznete v tématu Asynchronní programování s asynchronní a await. Asynchronní programování s asynchronním vzorem založeným async
na úlohách a await
dodržuje ho.
Operátor můžete použít await
pouze v metodě, výrazu lambda nebo anonymní metodě, která je upravena asynchronním klíčovým slovem. V rámci asynchronní metody nemůžete použít await
operátor v těle synchronní místní funkce, uvnitř bloku příkazu lock a v nebezpečném kontextu.
Operand operátoru await
je obvykle jedním z následujících typů .NET: Task, Task<TResult>, ValueTask, nebo ValueTask<TResult>. Libovolný výraz awaitable však může být operand operátoru await
. Další informace najdete v části Výrazy Awaitable specifikace jazyka C#.
Typ výrazu await t
jeTResult
, pokud je Task<TResult> typ výrazu t
nebo ValueTask<TResult>. Pokud je typ t
nebo ValueTask, typ await t
je void
.Task V obou případech, pokud t
vyvolá výjimku, await t
znovu zvětšte výjimku.
Asynchronní datové proudy a jednorázové
Tento příkaz použijete await foreach
k využívání asynchronního datového proudu. Další informace najdete v foreach
části příkazu článku o příkazech iterace.
Příkaz slouží await using
k práci s asynchronně uvolnitelným objektem, tj. objektem typu, který implementuje IAsyncDisposable rozhraní. Další informace najdete v části Použití asynchronního použití v článku Implementace metody DisposeAsync.
operátor await v metodě Main
MetodaMain
, která je vstupním bodem aplikace, může vrátit Task
nebo Task<int>
povolit, aby byla asynchronní, takže můžete použít await
operátor v jeho těle. V dřívějších verzích jazyka C# zajistěte, aby Main
metoda čekala na dokončení asynchronní operace, můžete načíst hodnotu Task<TResult>.Result vlastnosti Task<TResult> instance, která je vrácena odpovídající asynchronní metodou. U asynchronních operací, které negenerují hodnotu, můžete metodu Task.Wait volat. Informace o tom, jak vybrat jazykovou verzi, najdete v tématu Správa verzí jazyka C#.
specifikace jazyka C#
Další informace najdete v části Výrazy Await specifikace jazyka C#.