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 DownloadDocsMainPageAsyncdö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://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.

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öntemdekullanabilirsinizawait. Zaman uyumsuz bir yöntemde, zaman uyumlu bir işlevin gövdesinde, bir lock deyiminin bloğunun içinde 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 tTResultt 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 TaskTask<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.

Ayrıca bkz.