await işleci (C# başvurusu)

işleci, işleneni tarafından temsil edilen zaman uyumsuz işlem tamamlayana kadar kapsayan zaman uyumsuz yöntemin await değerlendirilmesini askıya alır. Zaman uyumsuz işlem tamamlandığında işleç, await varsa, işleminin sonucu döndürür. İşleç, zaten tamamlanmış bir işlemi temsil eden işlenene uygulandığında, kapsayan yöntemin askıya alınmasına gerek kalmadan hemen await işlem sonucu döndürür. awaitişleci, zaman uyumsuz yöntemi değerlendiren iş parçacığını engellemez. awaitİşleç kapsayan zaman uyumsuz yöntemi askıya alır, denetim yöntemini çağıran döndürür.

Aşağıdaki örnekte yöntemi, tamamlandığında bir byte dizisi üreten zaman uyumsuz bir işlemi temsil HttpClient.GetByteArrayAsync Task<byte[]> eden örneğini döndürür. İşlem tamamlandıktan sonra işleç await yöntemi askıya DownloadDocsMainPageAsync alır. Askıya DownloadDocsMainPageAsync alınırsa, denetimi Main çağıran olan yöntemine DownloadDocsMainPageAsync döndürülür. yöntemi, yöntemi tarafından gerçekleştirilen zaman uyumsuz işlem Main sonucuna ihtiyaç olana kadar DownloadDocsMainPageAsync yürütülür. Tüm GetByteArrayAsync baytları alan yöntemin DownloadDocsMainPageAsync geri kalanı değerlendirilir. Bundan sonra yöntemin Main geri kalanı değerlendirilir.

using System;
using System.Net.Http;
using System.Threading.Tasks;

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://docs.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.

Yukarıdaki örnekte, Main C# 7.1'den itibaren mümkün olan zaman uyumsuz yöntemi 2. Daha fazla bilgi için Main metodu 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 zaman uyumsuz programlama ve async görev tabanlı zaman uyumsuz await desenini izler.

işlecini await yalnızca async anahtar sözcüğü tarafından değiştirilen bir yöntemde, lambdaifadesinde veya anonim yöntemde kullanabilirsiniz. Zaman uyumsuz bir yöntemde, zaman uyumlu bir işlevin gövdesinde, kilit deyimi bloğu içinde ve güvenli olmayan bir bağlamda await işleci kullanaabilirsiniz.

işlecinin await işleneni genellikle şu .NET türlerinden biri olur: Task , , veya Task<TResult> ValueTask ValueTask<TResult> . Ancak, herhangi bir beklenebilir ifade işlecinin await işleneni olabilir. Daha fazla bilgi için C# dil belirtimlerinin Beklenebilir ifadeler bölümüne bakın.

İfadenin await t TResult türü, ifadenin türü veya t ise Task<TResult> ValueTask<TResult> şeklindedir. türü veya t Task ValueTask ise, türü await t void ise. Her iki durumda t da, bir özel durum await t oluşturursa, özel durumu yeniden oluşturur. Özel durum işleme hakkında daha fazla bilgi için try-catch deyimi makalenin zaman uyumsuz yöntemler bölümündeki Özel Durumlar bölümüne bakın.

ve async anahtar await sözcükleri C# 5 ve üzerinde kullanılabilir.

Zaman uyumsuz akışlar ve atılabilir akışlar

C# 8.0'dan itibaren, zaman uyumsuz akışlar ve atılabilir akışlar ile çalışılabilir.

Zaman uyumsuz await foreach bir veri akışı kullanmak için deyimini kullanırız. Daha fazla bilgi foreach için C# 8.0'daki yeniler makalesinde Yineleme deyimleri makalesi ve Zaman uyumsuz akışlar bölümüne bakın.

deyimini kullanarak zaman uyumsuz olarak atılabilir bir nesneyle, yani arabirimi uygulayan türünde await using bir nesneyle IAsyncDisposable çalışırsiniz. Daha fazla bilgi için DisposeAsync yöntemi uygulama makalenin Zaman uyumsuz atılabilir kullanma bölümüne bakın.

Main yönteminde await işleci

C# 7.1'den Main başerek, uygulama giriş noktası olan yöntemi veya dönüşebilir, böylece işleci gövdesinde kullanabileceğiniz zaman uyumsuz Task Task<int> await olabilir. Önceki C# sürümlerinde, yöntemin zaman uyumsuz bir işlem tamamlanmasını beklemesinden emin olmak için, karşılık gelen zaman uyumsuz yöntem tarafından döndürülen örneğin özelliğinin Main Task<TResult>.Result değerini Task<TResult> alın. Bir değer üretmez zaman uyumsuz işlemler için yöntemini Task.Wait çağırarak. Dil sürümünü seçme hakkında bilgi için bkz. C# dil sürümü.

C# dili belirtimi

Daha fazla bilgi için C# dil belirtimlerinin Await ifadeleri bölümüne bakın.

Ayrıca bkz.