Aracılığıyla paylaş


Async ve Await ile Zaman Uyumsuz Programlama (C# ve Visual Basic)

Zaman uyumsuz programlama kullanarak performans sorunlarını önleyebilir ve uygulamanızın genel yanıt verme becerisini geliştirebilirsiniz.Ancak, zaman uyumsuz uygulamalar yazmaya yönelik geleneksel teknikler karmaşık olabilir ve bu nedenle yazılmaları, hataların ayıklanması ve bakım yapılması zorlaşabilir.

Visual Studio 2012, .NET Framework 4,5 ve Windows Çalışma Zamanı içinde zaman uyumsuz desteği kullanan basitleştirilmiş bir yaklaşım olan zaman uyumsuz programlamayı sunar.Derleyici, normalde geliştiricinin yaptığı zor işi yapar ve uygulamanız zaman uyumlu koda benzer bir mantıksal yapıyı korur.Sonuç olarak, zaman uyumsuz programlama avantajlarının tamamını çok daha az çaba harcayarak elde edebilirsiniz.

Bu konu, aşağıdaki bölümleri içermektedir.

  • Zaman Uyumsuzluk Yanıt Verme Hızını Geliştirir
  • Zaman Uyumsuz Yöntemleri Yazmak Daha Kolaydır
  • Zaman Uyumsuz Yöntemde Neler Olur?
  • Zaman Uyumsuz API Yöntemleri
  • İş Parçacıkları
  • Async ve Await
  • Dönüş Türleri ve Parametreleri
  • Adlandırma Kuralı
  • İlgili Konular
  • Tam Örnek
  • İlgili Konular

Bu konu zaman uyumsuz programlamanın ne zaman ve nasıl kullanılması gerektiği hakkında genel bakış içerir ve ayrıntılar ve örnekler içeren destek konularına bağlantılar sunar.

Zaman Uyumsuzluk Yanıt Verme Hızını Geliştirir

Zaman uyumsuzluk, uygulamanızın Web'e erişmesi gibi engelleme olasılığı bulunan faaliyetler için önemlidir.Web kaynağına erişim bazen yavaş veya gecikmeli olabilir.Böyle bir etkinlik zaman uyumlu işlemde engellenirse uygulamanın tamamı beklemelidir.Uygulama, zaman uyumsuz bir işlemde olası engelleme görevi sona erinceye kadar web kaynağına bağlı olmayan diğer işlerle devam eder.

Aşağıdaki tabloda, zaman uyumsuz programlamanın yanıt verme hızını geliştirdiği genel alanlar gösterilmektedir..NET Framework 4,5 ve Windows Çalışma Zamanı kaynaklarından listelenen API'ler, zaman uyumsuz programlamayı destekleyen yöntemler içerir.

Uygulama alanı

Zaman uyumsuz yöntemler içeren API'leri destekleme

Web erişimi

HttpClient, SyndicationClient

Dosyalarla çalışma

StorageFile, StreamWriter, StreamReader, XmlReader

Görüntülerle çalışma

MediaCapture, BitmapEncoder, BitmapDecoder

WCF programlama

Zaman Uyumlu ve Zaman Uyumsuz İşlemler

Tüm kullanıcı arabirimi ilişkili faaliyetler genellikle tek bir iş parçacığını paylaştığından, zaman uyumsuzluğun kullanıcı arabirimi iş parçacığına erişen uygulamalar için özellikle önem taşıdığı kanıtlanmıştır.Herhangi bir işlem zaman uyumlu bir uygulamada engellenirse, tümü engellenir.Uygulamanız yanıt vermiyordur ve bunu uygulamanın beklediği değil de başarısız olduğu şeklinde yorumlayabilirsiniz.

Zaman uyumsuz yöntemleri kullandığınızda, uygulama arabirime yanıt vermeye devam eder.Bir pencereyi yeniden boyutlandırabilir veya simge durumuna küçültebilir ya da bitmesini beklemek istemiyorsanız kapatabilirsiniz.

Zaman uyumsuz tabanlı yaklaşım otomatik bir iletimin eşdeğerini, zaman uyumsuz işlemler tasarlarken seçebileceğiniz seçenekler listesine ekler.Diğer bir deyişle, geleneksel zaman uyumsuz programlamanın tüm avantajlarından yararlanabilirsiniz, buna rağmen geliştiricinin daha az çaba sarf etmesi gerekir.

Zaman Uyumsuz Yöntemleri Yazmak Daha Kolaydır

Visual Basic'teki Async ve Await anahtar sözcükleri ile C#'deki async ve await anahtar sözcükleri zaman uyumsuz programlamanın temelini oluşturur.Bu iki anahtar sözcüğü kullanarak neredeyse bir zaman uyumlu yöntem kadar kolay bir şekilde zaman uyumsuz bir yöntem oluşturmak için .NET Framework veya Windows Çalışma Zamanı üzerinde kaynaklar kullanabilirsiniz."Async" ve "await" kullanarak tanımladığınız zaman uyumsuz yöntemler, zaman uyumsuz yöntemler olarak adlandırılır.

Aşağıdaki örnekte zaman uyumsuz bir yöntem gösterilmektedir.Kodda yer alan hemen hemen her şey size tamamen tanıdık gelmiş olmalıdır.Açıklamalar, zaman uyumsuzluğu eklemek için oluşturduğunuz özellikleri çağırır.

Örnek dosyasının tamamını bu konunun sonunda bulabilirsiniz ve örneği Zaman Uyumsuz Örneği: "Async ve Await ile Zaman Uyumsuz Programlama Örneği" sayfasından indirebilirsiniz.

' Three things to note in the signature: 
'  - The method has an Async modifier.  
'  - The return type is Task or Task(Of T). (See "Return Types" section.) 
'    Here, it is Task(Of Integer) because the return statement returns an integer. 
'  - The method name ends in "Async."
Async Function AccessTheWebAsync() As Task(Of Integer)

    ' You need to add a reference to System.Net.Http to declare client. 
    Dim client As HttpClient = New HttpClient()

    ' GetStringAsync returns a Task(Of String). That means that when you await the 
    ' task you'll get a string (urlContents). 
    Dim getStringTask As Task(Of String) = client.GetStringAsync("https://msdn.microsoft.com")


    ' You can do work here that doesn't rely on the string from GetStringAsync.
    DoIndependentWork()

    ' The Await operator suspends AccessTheWebAsync. 
    '  - AccessTheWebAsync can't continue until getStringTask is complete. 
    '  - Meanwhile, control returns to the caller of AccessTheWebAsync. 
    '  - Control resumes here when getStringTask is complete.  
    '  - The Await operator then retrieves the string result from getStringTask. 
    Dim urlContents As String = Await getStringTask

    ' The return statement specifies an integer result. 
    ' Any methods that are awaiting AccessTheWebAsync retrieve the length value. 
    Return urlContents.Length
End Function
// Three things to note in the signature: 
//  - The method has an async modifier.  
//  - The return type is Task or Task<T>. (See "Return Types" section.)
//    Here, it is Task<int> because the return statement returns an integer. 
//  - The method name ends in "Async."
async Task<int> AccessTheWebAsync()
{ 
    // You need to add a reference to System.Net.Http to declare client.
    HttpClient client = new HttpClient();

    // GetStringAsync returns a Task<string>. That means that when you await the 
    // task you'll get a string (urlContents).
    Task<string> getStringTask = client.GetStringAsync("https://msdn.microsoft.com");

    // You can do work here that doesn't rely on the string from GetStringAsync.
    DoIndependentWork();

    // The await operator suspends AccessTheWebAsync. 
    //  - AccessTheWebAsync can't continue until getStringTask is complete. 
    //  - Meanwhile, control returns to the caller of AccessTheWebAsync. 
    //  - Control resumes here when getStringTask is complete.  
    //  - The await operator then retrieves the string result from getStringTask. 
    string urlContents = await getStringTask;

    // The return statement specifies an integer result. 
    // Any methods that are awaiting AccessTheWebAsync retrieve the length value. 
    return urlContents.Length;
}

AccessTheWebAsync, GetStringAsync çağırma ve tamamlanmasını bekleme arasında gerçekleştirebileceği bir iş içermiyorsa, aşağıdaki tek deyimde çağırma ve bekleme işlemlerini gerçekleştirerek kodunuzu basitleştirebilirsiniz.

Dim urlContents As String = Await client.GetStringAsync()
string urlContents = await client.GetStringAsync();

Aşağıdaki özellikler, önceki örneği neyin zaman uyumsuz hale getirdiğini özetler.

  • Yöntem imzası bir Async veya async değiştiricisi içerir.

  • Zaman uyumsuz yöntemin adı kurala göre "Async" soneki ile sona erer.

  • Dönüş türü aşağıdaki türlerden biridir:

    • Yönteminizin TResult türünde işlenen içeren bir dönüş ifadesi varsa Task.

    • Yönteminizin bir dönüş ifadesi yoksa ya da işlenen içermeyen bir dönüş ifadesi varsa Task.

    • Zaman uyumsuz bir olay işleyici yazıyorsanız Void (Visual Basic içinde Sub).

    Daha fazla bilgi için bu konunun ilerleyen kısımlarındaki "Dönüş Türleri ve Parametreler" bölümüne bakın.

  • Yöntem, genellikle beklenen zaman uyumsuz işlem tamamlanana kadar devam edemediği bir noktayı işaretleyen en az bir await ifadesi içerir.Bu sırada yöntem askıya alınır ve denetim yöntemi arayana döner.Bu konunun sonraki bölümünde askıya alma noktasında neler olduğu gösterilmektedir.

Zaman uyumsuz yöntemlerde ne yapmak istediğinizi belirtmek için sağlanan anahtar sözcükleri ve türleri kullanırsınız ve denetim, askıya alınan bir yöntemde await noktasına geldiğinde olması gerekenlerin izlenmesi dahil olmak üzere geri kalan işlemleri derleyici yapar.Döngüler ve özel durum işleme gibi bazı rutin işlemlerin geleneksel zaman uyumsuz kodla yapılması zor olabilir.Zaman uyumsuz bir yöntemde, bu öğeleri olabildiğince zaman uyumlu çözümde yazarsınız ve sorun çözülür.

.NET Framework'ün önceki sürümlerindeki zaman uyumsuzluğu hakkında daha fazla bilgi için bkz. TPL ve Geleneksel .NET Framework Zaman Uyumsuz Programlama.

Zaman Uyumsuz Yöntemde Neler Olur?

Zaman uyumsuz programlama ile ilgili olarak anlamanız gereken en önemli şey, denetim akışının yöntemden yönteme nasıl geçtiğidir.Aşağıdaki diyagram işlem boyunca size yol gösterecektir.

Zaman uyumsuz programı izleme

Diyagramdaki sayılar aşağıdaki adımlara karşılık gelir.

  1. Bir olay işleyicisi, AccessTheWebAsync zaman uyumsuz yöntemini çağırır ve bekler.

  2. AccessTheWebAsync, HttpClient örneği oluşturur ve bir web sitesinin içeriklerini dize olarak indirmek üzere GetStringAsync zaman uyumsuz yöntemini çağırır.

  3. GetStringAsync içinde ilerlemesini engelleyen bir durum oluştu.Bir web sitesinin indirmesini veya başka bir engelleyen etkinliği beklemesi gerekebilir.GetStringAsync, kaynakların engellenmesini önlemek için denetimi onu arayan AccessTheWebAsync öğesine verir.

    GetStringAsync, bir Task döndürür, burada TResult bir dizedir ve AccessTheWebAsync, görevi getStringTask değişkenine atar.Görev, çalışma tamamlandığında gerçek dize değerini oluşturma taahhüdü ile GetStringAsync için yapılan çağrının devam eden işlemini temsil eder.

  4. getStringTask henüz beklenmediği için AccessTheWebAsync, GetStringAsync öğesinden gelen nihai sonuca bağımlı olmayan diğer çalışmalar ile devam edebilir.Bu iş, DoIndependentWork zaman uyumlu yöntemine yapılan bir çağrıyla temsil edilir.

  5. DoIndependentWork, görevini gerçekleştiren ve arayanına dönen bir zaman uyumlu yöntemdir.

  6. AccessTheWebAsync, getStringTask öğesinden alınan bir sonuç olmadan yapabileceği işleri bitmiştir.AccessTheWebAsync, indirilen dizenin uzunluğunu hesaplamak ve döndürmek ister, ancak yöntem dizeye sahip oluncaya kadar değeri hesaplamaz.

    Bu nedenle, AccessTheWebAsync bir await işleci kullanarak ilerlemesini askıya alır ve denetimi AccessTheWebAsync çağıran yönteme bırakır.AccessTheWebAsync, arayana Task(Of Integer) veya Task<int> döndürür.Görev, indirilen dizenin uzunluğu olan bir tamsayı sonucu verecek bir taahhüdü temsil eder.

    [!NOT]

    GetStringAsync (ve bu nedenle getStringTask), AccessTheWebAsync beklemeden önce tamamlanırsa denetim AccessTheWebAsync öğesinde kalır.Çağrılan zaman uyumsuz işlem (getStringTask) zaten tamamlanmışsa ve AccessTheWebSync için nihai sonucu bekleme zorunluluğu yoksa, AccessTheWebAsync için askıya alma ve daha sonra dönme işlemi boşa gidecektir.

    Arayanın içinde (bu örnekte olay işleyicisi), işleme düzeni devam eder.Arayan sonucu beklemeden AccessTheWebAsync sonucuna bağlı olmayan diğer işleri yapabilir ya da hemen beklemeye geçebilir. Olay işleyicisi AccessTheWebAsync için bekliyordur ve AccessTheWebAsyncGetStringAsync için bekliyordur.

  7. GetStringAsync, bir dize sonucunu tamamlar ve oluşturur.Dize sonucu GetStringAsync için yapılan çağrıdan beklediğiniz şekilde döndürülmez. (Yöntemin 3. adımdaki bir görevi zaten döndürdüğünü unutmayın.) Bunun yerine, dize sonucu getStringTask tamamlama yöntemini belirten bir görevde saklanır.await işleci sonuçları getStringTask kaynağından alır.Atama ifadesi alınan sonucu urlContents hedefine atar.

  8. AccessTheWebAsync içinde dize sonucu olduğunda yöntem dize uzunluğunu hesaplayabilir.Ardından AccessTheWebAsync çalışması da tamamlanır ve bekleyen olay işleyicisi devam edebilir.Konunun sonundaki tam örnekte olay işleyicisinin uzunluk sonucundaki değeri aldığını ve yazdığını onaylayabilirsiniz.

Zaman uyumsuz programlama konusunda yeniyseniz, zaman uyumlu ve zaman uyumsuz davranış arasındaki farkları değerlendirmek için bir dakikanızı ayırın.Zaman uyumlu yöntem, işi tamamlandığında döndürür (5. adım), ancak zaman uyumsuz bir yöntem işi askıya alındığında görev değeri döndürür (3 ve 6. adım).Zaman uyumsuz yöntem çalışmasını tamamladığında görev tamamlandı olarak işaretlenir ve varsa sonuç görevde depolanır.

Denetim akışı hakkında daha fazla bilgi için bkz. Zaman Uyumsuz Programlarda Denetim Akışı (C# ve Visual Basic).

Zaman Uyumsuz API Yöntemleri

Zaman uyumsuz programlamayı destekleyen GetStringAsync gibi yöntemleri nerede bulacağınızı merak ediyor olabilirsiniz..NET Framework 4,5 async ve await ile çalışan birçok üye içerir.Bu üyeleri, üye adında bulunan "Async" ekinden ve Task ya da Task dönüş türünden tanıyabilirsiniz.Örneğin, System.IO.Stream sınıfı CopyToAsync, ReadAsync ve WriteAsync gibi yöntemlerin yanı sıra CopyTo, Read ve Write zaman uyumlu yöntemleri içerir.

Windows Çalışma Zamanı ayrıca Windows Mağazası uygulamalarında async ve await ile birlikte kullanabileceğiniz birçok yöntem içerir.Daha fazla bilgi ve örnek yöntemler için bkz. Hızlı başlangıç: zaman uyumsuz programlama için await işleci, Zaman uyumsuz programlama (Windows Mağazası uygulamaları) ve WhenAny: .NET Framework ve Windows Çalışma Zamanı (C# ve Visual Basic) arasında köprü oluşturma.

İş Parçacıkları

Zaman uyumsuz yöntemlerin engelleyici olmayan işlemler olmaları amaçlanmıştır.Zaman uyumsuz yöntemdeki bir 'await' ifadesi, beklenen görev çalışırken mevcut iş parçacığını engellemez.Bunun yerine ifade, yöntemin geri kalanını yöntemin devamı olarak imzalar ve denetimi zaman uyumsuz yöntemi arayan kişiye verir.

async ve await anahtar sözcükleri ek iş parçacıklarının oluşturulmasına neden olmaz.Zaman uyumsuz yöntem kendi iş parçacığı üzerinde çalışmadığı için zaman uyumsuz yöntemler çoklu iş parçacığı kullanımı gerektirmez.Yöntem geçerli eşitleme kapsamının üzerinde çalışır ve yalnızca yöntem etkin olduğunda iş parçacığındaki zamanı kullanır.CPU kullanan bir işi arka plan iş parçacığına taşımak için Task.Run kullanabilirsiniz, ancak arka plan iş parçacığı, sonuçları bekleyen işlemler için yardımcı olmaz.

Zaman uyumsuz programlamaya zaman uyumsuz yaklaşım, hemen hemen her durumda varolan yaklaşımlara tercih edilir.Özellikle kod daha basit olduğundan ve yarış durumlarına karşı önlem almanız gerekmediğinden, bu yaklaşım GÇ'ye bağlı işlemler için BackgroundWorker yaklaşımına göre daha iyidir.Task.Run ile birlikte zaman uyumsuz programlama, CPU'ya bağlı işlemler için BackgroundWorker öğesinden daha iyidir; çünkü zaman uyumsuz programlama, Task.Run tarafından iş parçacığı havuzuna aktarılan işten çalıştırılan kodunuzun koordinasyon ayrıntılarını ayırır.

Async ve Await

Bir yöntemin zaman uyumlu bir yöntem olduğunu Async veya async değiştiricisi kullanarak belirtirseniz, aşağıdaki iki özelliği etkinleştirirsiniz.

  • İşaretli zaman uyumsuz yöntem, askıya alma noktaları belirlemek için Await veya await kullanabilir.await işleci derleyiciye, beklenen zaman uyumsuz işlem tamamlanmadan zaman uyumsuz yöntemin bu noktanın ilerisine devam edemeyeceğini bildirir.Bu sırada denetim, zaman uyumsuz yönteminin arayanına döner.

    Bir Await deyimindeki zaman uyumsuz bir yöntemin askıya alınması yöntemden çıkış anlamına gelmez ve finally blokları çalışmaz.

  • İşaretli zaman uyumsuz yöntem, kendisinin çağırdığı yöntemler tarafından bekleniyor olabilir.

Bir zaman uyumsuz yöntem genel olarak bir veya daha fazla await işleci örneği içerir, ancak await ifadelerinin eksikliği bir derleyici hatasına neden olmaz.Zaman uyumsuz bir yöntem, askıya alma noktası için await işlecini kullanmıyorsa, zaman uyumsuz değiştiriciye rağmen zaman uyumlu bir yöntem gibi yürütülür.Derleyici bu tür yöntemler için bir uyarı verir.

Async, async, Await ve await bağlamsal anahtar sözcüklerdir.Daha fazla bilgi ve örnek için aşağıdaki konulara bakın:

Dönüş Türleri ve Parametreleri

.NET Framework programlamada zaman uyumsuz bir yöntem genelde bir Task veya bir Task döndürür.Zaman uyumsuz bir yöntemde, başka bir zaman uyumsuz yöntemin çağrısından döndürülen göreve await işleci uygulanır.

Task dönüş türünü yöntem Return (Visual Basic) veya return (C#) ifadesi ve TResult türünde işleç içermesi halinde belirtirsiniz.

Yöntemde return deyimi yoksa veya bir işleç döndürmeyen bir return deyimi varsa, dönüş türü olarak Task kullanırsınız.

Aşağıdaki örnekte, Task veya Task döndüren bir yöntemi nasıl bildireceğiniz ve çağıracağınız gösterilmektedir.

' Signature specifies Task(Of Integer)
Async Function TaskOfTResult_MethodAsync() As Task(Of Integer)

    Dim hours As Integer
    ' . . .
    ' Return statement specifies an integer result.
    Return hours
End Function

' Calls to TaskOfTResult_MethodAsync
Dim returnedTaskTResult As Task(Of Integer) = TaskOfTResult_MethodAsync()
Dim intResult As Integer = Await returnedTaskTResult
' or, in a single statement
Dim intResult As Integer = Await TaskOfTResult_MethodAsync()


' Signature specifies Task
Async Function Task_MethodAsync() As Task

    ' . . .
    ' The method has no return statement.
End Function

' Calls to Task_MethodAsync
Task returnedTask = Task_MethodAsync()
Await returnedTask
' or, in a single statement
Await Task_MethodAsync()
// Signature specifies Task<TResult>
async Task<int> TaskOfTResult_MethodAsync()
{
    int hours;
    // . . .
    // Return statement specifies an integer result.
    return hours;
}

// Calls to TaskOfTResult_MethodAsync
Task<int> returnedTaskTResult = TaskOfTResult_MethodAsync();
int intResult = await returnedTaskTResult;
// or, in a single statement
int intResult = await TaskOfTResult_MethodAsync();


// Signature specifies Task
async Task Task_MethodAsync()
{
    // . . .
    // The method has no return statement.  
}

// Calls to Task_MethodAsync
Task returnedTask = Task_MethodAsync();
await returnedTask;
// or, in a single statement
await Task_MethodAsync();

Döndürülmüş her görev, devam eden bir çalışmayı temsil eder.Bir görev, zaman uyumsuz işlemin durumu hakkındaki bilgileri saklar ve sonunda, işlemden alınan nihai sonuca veya başarısız olursa işlemin neden olduğu bir özel duruma ilişkin bilgileri içerir.

Bir zaman uyumsuz yöntem aynı zamanda bir Sub yöntemi (Visual Basic) veya bir void dönüş türü (C#) olabilir.Bu dönüş türü, genellikle void dönüş türünün gerekli olduğu durumlarda olay işleyicilerini tanımlamak için kullanılır.Zaman uyumsuz olay işleyicileri, genellikle zaman uyumsuz programlar için başlangıç noktası olarak hizmet eder.

Sub yordamı olan veya void dönüş türüne sahip bir zaman uyumsuz yöntem beklenemez ve void döndüren yöntemi arayan kişi, yöntemin oluşturduğu hiçbir özel durumu yakalayamaz.

Bir zaman uyumsuz yöntem Visual Basic'te ByRef parametrelerini veya C#'de ref veya out parametrelerini bildiremez, ancak yöntem bu parametrelere sahip yöntemleri çağırabilir.

Daha fazla bilgi ve örnek için bkz. Zaman Uyumsuz Dönüş Türleri (C# ve Visual Basic).Zaman uyumsuz yöntemlerde özel durumları yakalama hakkında daha fazla bilgi için bkz. try-catch (C# Başvurusu) veya Try...Catch...Finally Deyimi (Visual Basic).

Windows Çalışma Zamanı programlamadaki zaman uyumsuz API'ler, aşağıdaki görevlere benzeyen dönüş türlerinden birine sahiptir:

Daha fazla bilgi ve örnek için bkz. Hızlı başlangıç: zaman uyumsuz programlama için await işlecini kullanma.

Adlandırma Kuralı

Kural olarak, Async veya async değiştiricisi içeren yöntemlerin adlarına "Async" eklersiniz.

Bir olay, taban sınıf veya arabirim sözleşmesi farklı bir ad öneriyorsa kuralı yoksayabilirsiniz.Örneğin, Button1_Click gibi ortak olay işleyicileri yeniden adlandırmamanız gerekir.

İlgili Konular

Başlık

Açıklama

Örnek

İzlenecek yol: Async ve Await Kullanarak Web'e Erişme (C# ve Visual Basic)

Zaman uyumlu bir WPF çözümünü zaman uyumsuz bir WPF çözümüne nasıl dönüştüreceğinizi gösterir.Uygulama bir dizi web sitesi indirir.

Zaman Uyumsuz Örneği: Web'e Erişim için İzlenecek Yol (C# ve Visual Basic)

Nasıl yapılır: Task.WhenAll Kullanarak Zaman Uyumsuz İzlenecek Yolu Genişletme (C# ve Visual Basic)

Önceki izlenecek yola Task.WhenAll ekler.WhenAll kullanımı tüm indirmeleri aynı anda başlatır.

Nasıl yapılır: Async ve Await Kullanarak Birden Çok Web İsteğini Paralel Hale Getirme (C# ve Visual Basic)

Nasıl aynı anda birkaç görevi başlatacağınızı gösterir.

Zaman Uyumsuz Örneği: Birden Çok Web İsteğini Paralel Hale Getirme (C# ve Visual Basic)

Zaman Uyumsuz Dönüş Türleri (C# ve Visual Basic)

Zaman uyumsuz yöntemlerin döndürebileceği türleri gösterir ve her türün ne zaman uygun olduğunu açıklar.

Zaman Uyumsuz Programlarda Denetim Akışı (C# ve Visual Basic)

Ayrıntılı olarak birbirini izleyenler aracılığıyla denetim akışını izler ve zaman uyumsuz bir program ifadesi bekler.

Zaman Uyumsuz Örneği: Zaman Uyumsuz Programlarda (C# ve Visual Basic) Denetim Akışı

Async Uygulamanızda Hassas Ayar Yapma (C# ve Visual Basic)

Zaman uyumsuz çözümünüze aşağıdaki işlevin nasıl ekleneceğini gösterir:

Zaman Uyumsuz Örneği: Uygulamanıza İnce Ayar Yapma (C# ve Visual Basic)

Zaman Uyumsuz Uygulamalarda Yeniden Girişi İşleme (C# ve Visual Basic)

Çalıştırıldığı sırada etkin bir zaman uyumsuz işlemin yeniden başlatıldığı durumların nasıl işleneceğini gösterir.

WhenAny: .NET Framework ve Windows Çalışma Zamanı (C# ve Visual Basic) arasında köprü oluşturma

WhenAny``1 öğesini bir Windows Çalışma Zamanı yöntemiyle kullanabilmeniz için Windows Çalışma Zamanı içinde .NET Framework ve IAsyncOperations Görev türleri arasında nasıl köprü oluşturulacağını gösterir.

Zaman Uyumsuz Örneği: .NET ve Windows Çalışma Zamanı arasında köprü oluşturma (AsTask ve WhenAny)

Zaman Uyumsuz İptal: .NET Framework ve Windows Çalışma Zamanı (C# ve Visual Basic) arasında köprü oluşturma

CancellationTokenSource öğesini bir Windows Çalışma Zamanı yöntemiyle kullanabilmeniz için Windows Çalışma Zamanı içinde .NET Framework ve IAsyncOperations Görev türleri arasında nasıl köprü oluşturulacağını gösterir.

Zaman Uyumsuz Örneği: .NET ve Windows Çalışma Zamanı arasında köprü oluşturma (AsTask & İptali)

Dosya Erişimi için Async Kullanma (C# ve Visual Basic)

Dosyalara erişmek için zaman uyumsuz yöntemin ve await işlecinin kullanılmasına ilişkin avantajları listeler ve gösterir.

İzlenecek Yol: Hata Ayıklayıcıyı Zaman Uyumsuz Yöntemlerle Kullanma

Bir await deyimindeki denetim akışını gösterir ve Step Into, Step Over ve Step Out komutlarının zaman uyumsuz yöntemler içindeki davranışını gösterir.

Görev Tabanlı Zaman Uyumsuz Desen (TAP)

.NET Framework'te zaman uyumsuzluk için yeni bir düzen açıklar.Düzen Task ve Task türlerini temel alır.

Hızlı Başlangıç: C# veya Visual Basic'te Zaman Uyumsuz API'leri Çağırma

Bir Windows Mağazası uygulamasında async ve await işleçlerinin nasıl kullanılacağını gösterir.

Zaman uyumsuz programlama (Windows Mağazası uygulamaları)

Windows Çalışma Zamanı içindeki zaman uyumsuz programlamaya genel bir bakış sağlar.

Kanal 9 üzerinde Zaman Uyumsuz Videolar

Zaman uyumsuz programlama hakkında çeşitli videoların bağlantılarını sağlar.

Tam Örnek

Aşağıdaki kod, bu konuda bahsedilen Windows Presentation Foundation (WPF) uygulamasındaki MainWindow.xaml.vb veya MainWindow.xaml.cs dosyasıdır.Örneği Zaman Uyumsuz Örneği: "Async ve Await ile Zaman Uyumsuz Programlama Örneği" sayfasından indirebilirsiniz.

' Add an Imports statement and a reference for System.Net.Http 
Imports System.Net.Http

Class MainWindow

    ' Mark the event handler with async so you can use Await in it. 
    Private Async Sub StartButton_Click(sender As Object, e As RoutedEventArgs)

        ' Call and await separately. 
        'Task<int> getLengthTask = AccessTheWebAsync(); 
        '' You can do independent work here. 
        'int contentLength = await getLengthTask; 

        Dim contentLength As Integer = Await AccessTheWebAsync()

        ResultsTextBox.Text &=
            String.Format(vbCrLf & "Length of the downloaded string: {0}." & vbCrLf, contentLength)
    End Sub 


    ' Three things to note in the signature: 
    '  - The method has an Async modifier.  
    '  - The return type is Task or Task(Of T). (See "Return Types" section.) 
    '    Here, it is Task(Of Integer) because the return statement returns an integer. 
    '  - The method name ends in "Async."
    Async Function AccessTheWebAsync() As Task(Of Integer)

        ' You need to add a reference to System.Net.Http to declare client. 
        Dim client As HttpClient = New HttpClient()

        ' GetStringAsync returns a Task(Of String). That means that when you await the 
        ' task you'll get a string (urlContents). 
        Dim getStringTask As Task(Of String) = client.GetStringAsync("https://msdn.microsoft.com")


        ' You can do work here that doesn't rely on the string from GetStringAsync.
        DoIndependentWork()

        ' The Await operator suspends AccessTheWebAsync. 
        '  - AccessTheWebAsync can't continue until getStringTask is complete. 
        '  - Meanwhile, control returns to the caller of AccessTheWebAsync. 
        '  - Control resumes here when getStringTask is complete.  
        '  - The Await operator then retrieves the string result from getStringTask. 
        Dim urlContents As String = Await getStringTask

        ' The return statement specifies an integer result. 
        ' Any methods that are awaiting AccessTheWebAsync retrieve the length value. 
        Return urlContents.Length
    End Function 


    Sub DoIndependentWork()
        ResultsTextBox.Text &= "Working . . . . . . ." & vbCrLf
    End Sub 
End Class 

' Sample Output: 

' Working . . . . . . . 

' Length of the downloaded string: 41763.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;

// Add a using directive and a reference for System.Net.Http; 
using System.Net.Http;

namespace AsyncFirstExample
{
    public partial class MainWindow : Window
    {
        // Mark the event handler with async so you can use await in it. 
        private async void StartButton_Click(object sender, RoutedEventArgs e)
        {
            // Call and await separately. 
            //Task<int> getLengthTask = AccessTheWebAsync(); 
            //// You can do independent work here. 
            //int contentLength = await getLengthTask; 

            int contentLength = await AccessTheWebAsync();

            resultsTextBox.Text +=
                String.Format("\r\nLength of the downloaded string: {0}.\r\n", contentLength);
        }


        // Three things to note in the signature: 
        //  - The method has an async modifier.  
        //  - The return type is Task or Task<T>. (See "Return Types" section.)
        //    Here, it is Task<int> because the return statement returns an integer. 
        //  - The method name ends in "Async."
        async Task<int> AccessTheWebAsync()
        { 
            // You need to add a reference to System.Net.Http to declare client.
            HttpClient client = new HttpClient();

            // GetStringAsync returns a Task<string>. That means that when you await the 
            // task you'll get a string (urlContents).
            Task<string> getStringTask = client.GetStringAsync("https://msdn.microsoft.com");

            // You can do work here that doesn't rely on the string from GetStringAsync.
            DoIndependentWork();

            // The await operator suspends AccessTheWebAsync. 
            //  - AccessTheWebAsync can't continue until getStringTask is complete. 
            //  - Meanwhile, control returns to the caller of AccessTheWebAsync. 
            //  - Control resumes here when getStringTask is complete.  
            //  - The await operator then retrieves the string result from getStringTask. 
            string urlContents = await getStringTask;

            // The return statement specifies an integer result. 
            // Any methods that are awaiting AccessTheWebAsync retrieve the length value. 
            return urlContents.Length;
        }


        void DoIndependentWork()
        {
            resultsTextBox.Text += "Working . . . . . . .\r\n";
        }
    }
}

// Sample Output: 

// Working . . . . . . . 

// Length of the downloaded string: 41564.

Ayrıca bkz.

Başvuru

async (C# Başvurusu)

await (C# Başvurusu)

Await İşleci (Visual Basic)

Zaman Uyumsuz (Visual Basic)

Diğer Kaynaklar

Örnek: .NET Zaman Uyumsuz Programlama için Windows Mağazası Uygulamaları

Örnek: await WebClient Oluşturma

Örnek (C#): Koleksiyonu Uygulama Deposuna Kaydetme

Örnek (Visual Basic): Koleksiyonu Uygulama Deposuna Kaydetme