Share via


beklemek (C# Reference)

await Awaited görev tamamlanıncaya kadar yönteminin çalışmasını askıya almak için zaman uyumsuz yöntemini göreve uygulanan işleci. Devam eden iş görevi temsil eder.

Zaman uyumsuz yöntem, await kullanılan tarafından değiştirilmesi gerekir zaman uyumsuz anahtar sözcük. Kullanılarak tanımlanmış tür bir yöntem, async değiştiricisi ve genellikle içeren bir veya daha fazla await ifadeleri olarak adlandırılmıştır bir zaman uyumsuz yöntem.

Not

async Ve await anahtar sözcükler Visual Studio 2012 tanıtılan.Bu sürümdeki yeni özellikler hakkında daha fazla bilgi için bkz: Visual Studio 2012'daki Yenilikler.

Zaman uyumsuz programlama giriş için bkz: Zaman uyumsuz zaman uyumsuz programlama ve beklemek (C# ve Visual Basic).

Göreve await işleci uygulandığı genellikle uygulayan bir yöntem çağrısı gelen bir dönüş değeri olan görev tabanlı zaman uyumsuz desen. Örnekler türü değerleri Task veya Task<TResult>.

Aşağıdaki kodda, HttpClient yöntemi GetByteArrayAsync döndüren bir Task<byte[]>, getContentsTask. Görev tamamlandığında gerçek bayt dizisi üretmek için promise görevdir. await İşleci uygulandığı getContentsTask yürütme askıya almak için SumPageSizesAsync kadar getContentsTask tamamlandı. Bu arada, Denetim arayana döndürülen SumPageSizesAsync. Zaman getContentsTask tamamlandı, await ifade için bir bayt dizisi olarak değerlendirilir.

private async Task SumPageSizesAsync()
{
    // To use the HttpClient type in desktop apps, you must include a using directive and add a 
    // reference for the System.Net.Http namespace.
    HttpClient client = new HttpClient();
    // . . .
    Task<byte[]> getContentsTask = client.GetByteArrayAsync(url);
    byte[] urlContents = await getContentsTask;

    // Equivalently, now that you see how it works, you can write the same thing in a single line.
    //byte[] urlContents = await client.GetByteArrayAsync(url);
    // . . .
}

Önemli

Tam bir örnek için, bkz. İzlenecek yol: zaman uyumsuz kullanarak Web'e erişme ve (C# ve Visual Basic) beklemek.Örnek indirebilirsiniz Developer kod örnekleri Microsoft Web sitesi.AsyncWalkthrough_HttpClient projesinde örnektir.

Önceki örnekte gösterildiği gibi await sonucunu döndüren bir yöntem çağrısı için uygulanan bir Task<TResult>, sonra türü await TResult ifadesidir. await Sonucunu döndüren bir yöntem çağrısı için uygulanan bir Task, sonra türü await ifadesidir void. Aşağıdaki örnekte fark gösterilmektedir.

// Keyword await used with a method that returns a Task<TResult>.
TResult result = await AsyncMethodThatReturnsTaskTResult();

// Keyword await used with a method that returns a Task.
await AsyncMethodThatReturnsTask();

Bir await ifade iş parçacığı üzerinde yürüterek engellemek değil. Bunun yerine, zaman uyumsuz yöntem geri kalan awaited göreve devamı olarak imzalamak derleyici neden olur. Denetim daha sonra zaman uyumsuz yöntemini çağırana döndürür. Görevi tamamladığında, onun devamı ve kaldığı yerden zaman uyumsuz yöntem geri döndüğünde yürütülmesi çağırır.

Bir await hemen bir kapsayan, yalnızca gövdesi içinde deyim meydana gelebilir yöntemi, lambda ifadesi veya tarafından işaretlenmiş anonim yöntem bir async değiştirici. Bu terim bekler bu bağlamda yalnızca bir anahtar görevi görür. Başka bir yerde, tanımlayıcı olarak yorumlanır. Yöntemi, lambda ifadesi veya adsız yöntem içinde bir await ifade gerçekleştirilemez bir sorgu ifadesinde, zaman uyumlu bir işlev gövdesi içinde catch veya finally engellemek, bir özel durum işleme deyimi, bloğu içinde bir lock ifadesi, veya bir Güvenli olmayan içerik.

Özel Durumlar

Çoğu zaman uyumsuz yöntemleri döndürür bir Task veya Task<TResult>. Durumunu ve görev tamamlanmış olup, zaman uyumsuz yöntem bir özel duruma neden oldu veya iptal edildi ve nihai sonucu gibi geçmişi hakkında bilgi verilen görevin özelliklerini taşır. await İşleç, bu özellikleri erişir.

Neden olan bir özel görev döndüren bir zaman uyumsuz yöntem bekler, await işleç özel durumu yeniden oluşturur.

İptal edilirse, bir görev döndüren zaman uyumsuz yöntem bekler, await işleç yeniden oluşturur bir OperationCanceledException.

Hatalı bir durumda tek bir görevi birden çok özel yansıtabilir. Örneğin, görev çağrısı sonucu olabilir Task.WhenAll. Böyle bir görev bekler, await işlemi yalnızca bir özel durumları yeniden oluşturur. Ancak, özel durumlar rethrown tahmin edemezsiniz.

Hata işleme zaman uyumsuz yöntemleri örnekleri için bkz: try-catch (C# Reference).

Örnek

Aşağıdaki Windows Forms örnek kullanımını gösterir await bir zaman uyumsuz yöntem WaitAsynchronouslyAsync. Bu yöntem davranışını davranışı ile kontrast WaitSynchronously. Olmadan bir await bir göreve uygulanan işleç WaitSynchronously rağmen kullanımı zaman uyumlu olarak çalışır async değiştirici tanımına ve çağrı Thread.Sleep kendi gövdesinde.

private async void button1_Click(object sender, EventArgs e)
{
    // Call the method that runs asynchronously.
    string result = await WaitAsynchronouslyAsync();

    // Call the method that runs synchronously.
    //string result = await WaitSynchronously ();

    // Display the result.
    textBox1.Text += result;
}

// The following method runs asynchronously. The UI thread is not
// blocked during the delay. You can move or resize the Form1 window 
// while Task.Delay is running.
public async Task<string> WaitAsynchronouslyAsync()
{
    await Task.Delay(10000);
    return "Finished";
}

// The following method runs synchronously, despite the use of async.
// You cannot move or resize the Form1 window while Thread.Sleep
// is running because the UI thread is blocked.
public async Task<string> WaitSynchronously()
{
    // Add a using directive for System.Threading.
    Thread.Sleep(10000);
    return "Finished";
}

Ayrıca bkz.

Görevler

İzlenecek yol: zaman uyumsuz kullanarak Web'e erişme ve (C# ve Visual Basic) beklemek

Başvuru

zaman uyumsuz (C# Reference)

Kavramlar

Zaman uyumsuz zaman uyumsuz programlama ve beklemek (C# ve Visual Basic)