await (C# Başvurusu)
await işleci, beklenen görev tamamlanıncaya kadar yöntemin yürütülmesini askıya almak için zaman uyumsuz yöntemdeki bir göreve uygulanır.Görev, devam eden çalışmayı temsil eder.
await 'in kullanıldığı zaman uyumsuz yöntemin zaman uyumsuz anahtar sözcüğüyle değiştirilmesi gerekir.async değiştiricisi kullanılarak tanımlanmış genellikle bir veya daha fazla await ifadesi içeren bu tür bir yöntem, bir zaman uyumsuz yöntem olarak adlandırılmıştır.
[!NOT]
async ve await anahtar sözcükleri Visual Studio 2012'de kullanılmaya başlanmıştır.Zaman uyumsuz programlamaya giriş için bkz. Async ve Await ile Zaman Uyumsuz Programlama (C# ve Visual Basic).
await işlecinin genellikle uygulandığı görev, Görev Tabanlı Zaman Uyumsuz Deseni uygulayan bir yönteme yapılan bir çağrıdan dönüş değeridir.Örnekler arasında, Task veya Task türündeki değerler yer alır.
Aşağıdaki kodda, HttpClient yöntemi GetByteArrayAsync, Task<byte[]> bir getContentsTask döndürür.Görev, görev tamamlandığında gerçek bayt dizisini üretmek için bir vaattir.await işleci, getContentsTask tamamlanıncaya kadar SumPageSizesAsync içindeki yürütmeyi askıya almak için getContentsTask öğesine uygulanır.Bu sırada denetim, SumPageSizesAsync çağırana döndürülür.getContentsTask bittiğinde, await ifadesi 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: Async ve Await Kullanarak Web'e Erişme (C# ve Visual Basic).Microsoft web sitesindeki Geliştirici Kodu Örnekleri içinden örneği karşıdan yükleyebilirsiniz.Örnek, AsyncWalkthrough_HttpClient projesindedir. |
Önceki örnekte gösterildiği gibi, Task<TResult> getiren bir yöntem çağrısının sonucuna await uygulanırsa, await ifadesinin türü TResult olur.Task getiren bir yöntem çağrısının sonucuna await uygulanırsa, await ifadesinin türü void olur.Fark aşağıdaki örnekte gösterilmiştir.
// 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();
await ifadesi, üzerinde yürütme yaptığı iş parçacığını engellemez.Bunun yerine, derleyicinin yöntemin geri kalanını yöntemin bekleyen görevlerde devamı olarak imzalamasına neden olur.Denetleyin sonra zaman uyumsuz yöntemini çağırana döner.Görev tamamlandığında, devam etmesi için çağrıda bulunur ve zamanuyumsuz yöntemin yürütülmesine kaldığı yerden devam edilir.
await ifadesi yalnızca anında kapatma yönteminin, lambda ifadesinin veya async değiştirici tarafından işaretlenen bir anonim yöntemin gövdesinde oluşabilir.await terimi sadece bu bağlamda anahtar sözcük görevi görür.Başka bir yerde bu, tanımlayıcı olarak yorumlanır.Lambda ifadesi veya adsız yöntemle, bir await ifadesi, zaman uyumlu bir işlevin gövdesinde, bir sorgu ifadesinde, bir özel durum deyimi işlemecatch veya finally bloğunda, bir lock ifadesi bloğu veya bir güvenli olmayan içerikte geçemez.
Özel Durumlar
Çoğu zaman uyumsuz yöntemler bir Task veya Task döndürür.Döndürülen görevin özellikleri, görevin tam olup olmadığı, zaman uyumsuz yöntemin özel bir duruma neden olup olmadığı veya iptal edilip edilmediği ve nihai sonucun ne olduğu gibi görevin durumu geçmişi ve hakkında bilgiler taşır. await işleci, bu özelliklere erişir.
Özel duruma neden olan, görev döndüren bir zaman uyumsuz yöntem beklerseniz, await işleci özel durumu yeniden oluşturur.
İptal edilen bir görev döndüren zaman uyumsuz yöntem beklerseniz, await işleci yeniden OperationCanceledException oluşturur.
Hatalı bir durumdaki tek bir görev, birden çok özel durumu yansıtabilir.Örneğin, görev, Task.WhenAll öğesine yapılan bir çağrının sonucu olabilir.Böyle bir görevi beklerken, bekleme işlemi özel durumlardan yalnızca birini yeniden oluşturur.Ancak özel durumlardan hangisinin yeniden oluşacağını tahmin edemezsiniz.
Zaman uyumsuz yöntemlerdeki hata işleme örnekleri için bkz. try-catch (C# Başvurusu).
Örnek
Aşağıdaki Windows Forms örneğinde zaman uyumsuz WaitAsynchronouslyAsync yönteminde await kullanımı açıklanmıştır.WaitSynchronously davranışı ile yöntemin davranışını karşılaştırın.Bir await işlecini bir göreve uygulayarak WaitSynchronously, tanımında async değiştiricisinin kullanımı ve gövdesinde Thread.Sleep çağrısı olmasına rağmen zaman uyumlu olarak çalışır.
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: Async ve Await Kullanarak Web'e Erişme (C# ve Visual Basic)
Başvuru
Kavramlar
Async ve Await ile Zaman Uyumsuz Programlama (C# ve Visual Basic)