await işleci - görevin tamamlanmasını zaman uyumsuz olarak bekle
işleci, await
işleneni tarafından temsil edilen zaman uyumsuz işlem tamamlanana kadar kapsayan zaman uyumsuz yöntemin değerlendirmesini askıya alır. Zaman uyumsuz işlem tamamlandığında, await
işleç varsa işlemin sonucunu döndürür. await
İşleç, tamamlanmış bir işlemi temsil eden işlenene uygulandığında, kapatma yönteminin askıya alınmasına gerek kalmadan işlemin sonucunu hemen döndürür. await
işleci, zaman uyumsuz yöntemi değerlendiren iş parçacığını engellemez. İşleç kapsayan await
zaman uyumsuz yöntemi askıya alırsa, denetim yöntemini çağırana döner.
Aşağıdaki örnekte yöntemi, HttpClient.GetByteArrayAsync tamamlandığında bayt dizisi üreten zaman uyumsuz bir işlemi temsil eden örneği döndürür Task<byte[]>
. İşlem tamamlanana await
kadar işleç yöntemini askıya alır DownloadDocsMainPageAsync
. Askıya alındığında DownloadDocsMainPageAsync
, denetim çağıranı Main
olan yöntemine DownloadDocsMainPageAsync
döndürülür. yöntemi, Main
yöntemi tarafından gerçekleştirilen zaman uyumsuz işlemin sonucuna ihtiyaç duyana DownloadDocsMainPageAsync
kadar yürütülür. Tüm baytları aldığında GetByteArrayAsync , yöntemin DownloadDocsMainPageAsync
geri kalanı değerlendirilir. Bundan sonra, yöntemin Main
geri kalanı değerlendirilir.
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://video2.skills-academy.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.
Bir görev tamamlandığında bir await
ifadenin işleneni bildirim sağlamalıdır. Genel olarak, görev başarıyla veya başarısız olarak tamamlandığında bir temsilci çağrılır. await
C# dil belirtiminin bölümü, bu bildirimlerin nasıl uygulandığına ilişkin ayrıntıları sağlar.
Yukarıdaki örnekte zaman uyumsuz yöntemi kullanılabilecek.Main
Daha fazla bilgi için Main yöntemi bölümündeki await işlecine bakın.
Not
Zaman uyumsuz programlamaya giriş için bkz . Async ve await ile zaman uyumsuz programlama. ile async
zaman uyumsuz programlama ve await
görev tabanlı zaman uyumsuz deseni izler.
işlecini yalnızca zaman uyumsuz anahtar sözcük tarafından değiştirilen bir yöntemde, lambda ifadesinde veya anonim yöntemde kullanabilirsinizawait
. Zaman uyumsuz bir yöntemde, zaman uyumlu bir yerel işlevin gövdesinde, bir lock deyiminin bloğunda ve güvenli olmayan bir bağlamda işlecini kullanamazsınızawait
.
işlecinin await
işleneni genellikle şu .NET türlerinden biridir: Task, Task<TResult>, ValueTaskveya ValueTask<TResult>. Ancak, herhangi bir beklenebilir ifade işlecin işleneni await
olabilir. Daha fazla bilgi için C# dil belirtiminin Awaitable ifadeleri bölümüne bakın.
İfadenin türü, ifadenin await t
TResult
t
türü veya ValueTask<TResult>ise olur.Task<TResult> türü t
veya ValueTaskiseTask, türü await t
şeklindedirvoid
. Her iki durumda da bir özel durum oluşturursa t
, await t
özel durumu yeniden oluşturur.
Zaman uyumsuz akışlar ve atılabilirler
Zaman uyumsuz bir veri akışı kullanmak için deyimini kullanırsınız await foreach
. Daha fazla bilgi için Yineleme deyimleri makalesinin deyim bölümüne bakınforeach
.
zaman uyumsuz olarak atılabilir bir nesneyle, yani arabirim uygulayan IAsyncDisposable bir tür nesnesiyle çalışmak için deyimini kullanırsınızawait using
. Daha fazla bilgi için DisposeAsync yöntemi uygulama makalesinin Zaman uyumsuz atılabilir kullanım kullanma bölümüne bakın.
Main yönteminde await işleci
Main
Uygulama giriş noktası olan yöntemi veya döndürebilir Task
Task<int>
ve işleci gövdesinde kullanabilmeniz await
için zaman uyumsuz olmasını sağlayabilir. Önceki C# sürümlerinde, yöntemin Main
zaman uyumsuz bir işlemin tamamlanmasını beklediğinden emin olmak için, ilgili zaman uyumsuz yöntem tarafından döndürülen örneğin özelliğinin Task<TResult> değerini Task<TResult>.Result alabilirsiniz. Değer üretmeyen zaman uyumsuz işlemler için yöntemini çağırabilirsiniz Task.Wait . Dil sürümünü seçme hakkında bilgi için bkz . C# dil sürümü oluşturma.
C# dili belirtimi
Daha fazla bilgi için C# dil belirtiminin Await ifadeleri bölümüne bakın.