await operátor – aszinkron módon vár egy feladat befejezésére
Az await
operátor felfüggeszti a beágyazási aszinkron metódus kiértékelését, amíg az operandus által képviselt aszinkron művelet be nem fejeződik. Ha az aszinkron művelet befejeződik, az await
operátor visszaadja a művelet eredményét, ha van ilyen. Ha az operátor egy await
már befejezett műveletet jelképező operandusra van alkalmazva, a művelet eredményét azonnal, a beágyazási módszer felfüggesztése nélkül adja vissza. Az await
operátor nem blokkolja az aszinkron metódust kiértékelő szálat. Amikor az await
operátor felfüggeszti a beágyazási aszinkron metódust, a vezérlő visszatér a metódus hívójának.
A következő példában a HttpClient.GetByteArrayAsync metódus a Task<byte[]>
példányt adja vissza, amely egy aszinkron műveletet jelöl, amely a befejezett bájttömböt hozza létre. A művelet befejezéséig az await
operátor felfüggeszti a metódust DownloadDocsMainPageAsync
. Amikor DownloadDocsMainPageAsync
a rendszer felfüggeszti, a rendszer visszaadja a vezérlést a Main
metódusnak, amely a hívója DownloadDocsMainPageAsync
. A Main
metódus addig fut, amíg a metódus által DownloadDocsMainPageAsync
végrehajtott aszinkron művelet eredményére nem lesz szüksége. Amikor GetByteArrayAsync lekéri az összes bájtot, a metódus többi része DownloadDocsMainPageAsync
kiértékelésre kerül. Ezt követően a metódus többi része Main
kiértékelésre kerül.
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.
A kifejezés operandusának await
értesítést kell adnia egy feladat befejezésekor. A feladat befejezésekor általában egy meghatalmazottat hív meg a függvény, akár sikeresen, akár sikertelenül. A await
C# nyelvi specifikációjának szakasza részletesen ismerteti az értesítések implementálásának módját.
Az előző példa az aszinkron Main
metódust használja. További információkért tekintse meg a Főmetódus szakaszban található várakozási operátort.
Feljegyzés
Az aszinkron programozás bemutatása: Aszinkron programozás aszinkronnal és várakozással. Aszinkron programozás a feladatalapú aszinkron mintávalasync
és await
azt követi.
Az operátort csak az aszinkron await
kulcsszó által módosított metódusban, lambdakifejezésben vagy névtelen metódusban használhatja. Az aszinkron metóduson belül nem használhatja az await
operátort a szinkron helyi függvény törzsében, a zárolási utasítás blokkjában és nem biztonságos környezetben.
Az operátor operandusa await
általában a következő .NET-típusok egyike: Task, Task<TResult>, ValueTaskvagy ValueTask<TResult>. A várt kifejezés azonban az operátor operandusa await
lehet. További információ: A C# nyelv specifikációjának Várandó kifejezések szakasza.
A kifejezés await t
típusa az, TResult
ha a kifejezés t
Task<TResult> típusa vagy ValueTask<TResult>. Ha a típus t
vagy Task ValueTaskaz , akkor a típus await t
a következő void
. Mindkét esetben, ha t
kivételt ad ki, await t
a kivételt újból meg kell ismételni.
Aszinkron streamek és eldobható
Az utasítással await foreach
aszinkron adatstreamet használhat. További információkért tekintse meg az foreach
Iteration utasításokkal foglalkozó cikk utasítás szakaszát.
Az await using
utasítással egy aszinkron módon eldobható objektummal, vagyis egy interfészt implementáló IAsyncDisposable típusú objektummal dolgozhat. További információ: Az DisposeAsync metódus implementálása című cikk Aszinkron aszinkron használata című szakasza.
várakozási operátor a Main metódusban
A Main
metódus, amely az alkalmazás belépési pontja, visszaadható Task
, vagy Task<int>
lehetővé teszi aszinkron módon, hogy az operátort a await
törzsében használhassa. A korábbi C#-verziókban annak érdekében, hogy a Main
metódus megvárja az aszinkron művelet befejezését, lekérheti annak a példánynak az Task<TResult>.Result Task<TResult> értékét, amelyet a megfelelő aszinkron metódus ad vissza. Olyan aszinkron műveletek esetén, amelyek nem hoznak létre értéket, meghívhatja a metódust Task.Wait . A nyelvi verzió kiválasztásáról további információt a C# nyelvi verziószámozásában talál.
C# nyelvspecifikáció
További információ: A C# nyelv specifikációjának Kifejezések várva című szakasza.