await işleci - görevin tamamlanmasını zaman uyumsuz olarak bekler

işleci, await işleneni tarafından temsil edilen zaman uyumsuz işlem tamamlanana kadar kapsayan zaman uyumsuz yöntemin değerlendirilmesini askıya alır. Zaman uyumsuz işlem tamamlandığında işleç, await varsa işlemin sonucunu döndürür. await İşleç, zaten tamamlanmış bir işlemi temsil eden işlenene uygulandığında, kapatma yöntemi askıya alınmadan işlemin sonucunu hemen döndürür. await işleci, zaman uyumsuz yöntemi değerlendiren iş parçacığını engellemez. await İşleç kapsayan 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ınırsa DownloadDocsMainPageAsync , denetimi ç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.

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 zaman uyumsuz Main yöntem kullanılır. 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 awaitgörev tabanlı zaman uyumsuz deseni izler.

işlecini await yalnızca zaman uyumsuz anahtar sözcüğü tarafından değiştirilen bir yöntemde, lambda ifadesinde veya anonim yöntemde kullanabilirsiniz. Zaman uyumsuz bir yöntemde, zaman uyumlu bir işlevin gövdesinde, bir lock deyiminin bloğu 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, beklenebilir herhangi bir ifade işlecin işleneni await olabilir. Daha fazla bilgi için C# dil belirtimininAwaitable ifadeleri bölümüne bakın.

İfadenin türü, ifadenin await tt türü veya ValueTask<TResult>ise olurTask<TResult>.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. Özel durum işleme hakkında daha fazla bilgi için try-catch deyimi makalesinin Zaman uyumsuz yöntemlerdeki özel durumlar bölümüne bakın.

Zaman uyumsuz akışlar ve tek kullanımlıklar

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

MainUygulama giriş noktası olan yöntemi veya döndürebilir TaskTask<int>ve gövdesinde işlecini kullanabilmeniz await için zaman uyumsuz olmasını sağlar. Ö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 belirtimininAwait ifadeleri bölümüne bakın.

Ayrıca bkz.