Zaman Uyumsuz Desteğe Genel Bakış

C# 5 zaman uyumsuz programlama işlemini basitleştirmek için iki anahtar sözcük sunmuştur: Async ve await. Bu anahtar sözcükler, başka bir iş parçacığında uzun süre çalışan işlemleri (ağ erişimi gibi) yürütmek ve sonuçlardaki sonuçlara kolayca erişmek için görev paralel kitaplığı 'nı kullanan basit kod yazmanızı sağlar. Xamarin. iOS ve Xamarin. Android ' in en son sürümleri Async ve await 'yi destekler-bu belgede, Xamarin ile yeni söz dizimi kullanma hakkında açıklamalar ve bir örnek sağlanmaktadır.

Xamarin 'in zaman uyumsuz desteği, mono 3,0 Foundation üzerine kurulmuştur ve API profilini, Silverlight 'ın mobil kullanımı kolay bir sürümü olan .NET 4,5 ' nin mobil özellikli bir sürümü olacak şekilde yükseltir.

Genel Bakış

Bu belgede, yeni Async ve await anahtar sözcükleri tanıtılmakta ve Xamarin. iOS ve Xamarin. Android ' de zaman uyumsuz yöntemler uygulayan bazı basit örneklere kılavuzluk eder.

C# 5 ' in (birçok örnek ve farklı kullanım senaryosu dahil) yeni zaman uyumsuz özelliklerinin daha kapsamlı bir tartışması için zaman uyumsuz programlamamakalesine bakın.

Örnek uygulama basit bir zaman uyumsuz Web isteği yapar (ana iş parçacığını engellemeden), ardından Kullanıcı arabirimini indirilen HTML ve karakter sayısıyla güncelleştirir.

Örnek uygulama, ana iş parçacığını engellemeden basit bir zaman uyumsuz Web isteği yapar, ardından Kullanıcı arabirimini indirilen HTML ve karakter sayısıyla güncelleştirir

Xamarin 'in zaman uyumsuz desteği, mono 3,0 Foundation üzerine kurulmuştur ve API profilini, Silverlight 'ın mobil kullanımı kolay bir sürümü olan .NET 4,5 ' nin mobil özellikli bir sürümü olacak şekilde yükseltir.

Gereksinimler

C# 5 özellikleri, Xamarin. iOS 6,4 ve Xamarin. Android 4,8 'e dahil olan Mono 3,0 gerektirir. Bunun avantajlarından yararlanmak için mono, Xamarin. iOS, Xamarin. Android ve Xamarin. Mac dosyanızı yükseltmeniz istenir.

Async & await kullanma

async ve, await görev paralel kitaplığı ile birlikte çalışarak, uygulamanızın ana iş parçacığını engellemeden uzun süre çalışan görevleri gerçekleştirmek üzere iş parçacıklı kod yazmayı kolaylaştıran yeni C# dil özellikleridir.

async

Bildirim

asyncAnahtar sözcüğü bir yöntem bildirimine (veya bir lambda veya anonim yöntemine) yerleştirilir ve zaman uyumsuz, ie çalıştırabilen bir kod içerdiğini belirtir. çağıranın iş parçacığını engellemez.

İle işaretlenmiş bir yöntem async en az bir await ifadesi veya deyimi içermelidir. Yöntemde hiçbir await deyim yoksa, zaman uyumlu olarak çalıştırılır (değiştirici yokmuş gibi async ). Bu da derleyici uyarısına neden olur (ancak bir hata değildir).

Dönüş Türleri

Zaman uyumsuz bir yöntem Task , veya döndürmelidir Task<TResult>void .

TaskYöntem başka bir değer döndürmezse, dönüş türünü belirtin.

Task<TResult>Metodun bir değer döndürmesi gerekip gerekmediğini belirtin; burada TResult döndürülen tür ( int Örneğin,).

voidDönüş türü, genellikle gerekli olan olay işleyicileri için kullanılır. Void döndüren zaman uyumsuz yöntemleri çağıran kod await sonuç üzerinde olamaz.

Parametreler

Zaman uyumsuz metotlar ref veya out parametreleri bildiremez.

bekleme

Await işleci, zaman uyumsuz olarak işaretlenmiş bir yöntem içindeki bir göreve uygulanabilir. Bu, metodun bu noktada yürütmeyi durdurmasına ve görev tamamlanana kadar beklemesini sağlar.

Await kullanılması çağıranın iş parçacığını engellemez; bu denetim çağırana döndürülür. Bu, çağıran iş parçacığının engellenmediği anlamına gelir. Örneğin, bir görevi beklerken Kullanıcı arayüzü iş parçacığı engellenmeyecektir.

Görev tamamlandığında, yöntemi kodda aynı noktada yürütmeyi sürdürür. Bu, bir try-catch-finally bloğunun (varsa) TRY kapsamına döndürmeyi içerir. await bir catch veya finally bloğunda kullanılamaz.

Microsoft Docs için await hakkında daha fazla bilgi edinin.

Özel Durum İşleme

Zaman uyumsuz bir yöntem içinde oluşan özel durumlar görevde depolanır ve görev yapıldığında oluşturulur await . Bu özel durumlar, bir try-catch bloğu içinde yakalanıp işlenebilir.

İptal

Tamamlanması uzun süren zaman uyumsuz yöntemlerin iptali desteklemesi gerekir. Genellikle, iptal aşağıdaki gibi çağrılır:

  • Bir CancellationTokenSource nesne oluşturulur.
  • CancellationTokenSource.TokenÖrnek, iptal edilebilir bir zaman uyumsuz metoda geçirilir.
  • Yöntemi çağırarak iptal istenir CancellationTokenSource.Cancel .

Ardından görev kendisini iptal eder ve iptali onaylar.

İptal hakkında daha fazla bilgi için bkz. zaman uyumsuz uygulamanızda Ince ayar yapma (C#).

Örnek

Mobil uygulamalarda ve çalışan bir örneğini görmek için örnek Xamarin çözümünü (hem iOS hem de Android için) indirin await . Örnek kod bu bölümde daha ayrıntılı bir şekilde ele alınmıştır.

Zaman uyumsuz yöntem yazma

Aşağıdaki yöntem, bir async yöntemi bir, Ed göreviyle nasıl kodleyeceğinizi göstermektedir await :

public async Task<int> DownloadHomepage()
{
    var httpClient = new HttpClient(); // Xamarin supports HttpClient!

    Task<string> contentsTask = httpClient.GetStringAsync("https://visualstudio.microsoft.com/xamarin"); // async method!

    // await! control returns to the caller and the task continues to run on another thread
    string contents = await contentsTask;

    ResultEditText.Text += "DownloadHomepage method continues after async call. . . . .\n";

    // After contentTask completes, you can calculate the length of the string.
    int exampleInt = contents.Length;

    ResultEditText.Text += "Downloaded the html and found out the length.\n\n\n";

    ResultEditText.Text += contents; // just dump the entire HTML

    return exampleInt; // Task<TResult> returns an object of type TResult, in this case int
}

Şu noktalara göz önünde edin:

  • Yöntemi bildirimi, async anahtar sözcüğünü içerir.
  • Dönüş türü, Task<int> kodun çağrılması int Bu yöntemde hesaplanabilecek değere erişebilir.
  • Return ifadesinin return exampleInt; bir Integer nesnesi olduğu, yöntemin döndürdüğü olgu ise Task<int> dil geliştirmelerinden bir parçasıdır.

Zaman uyumsuz yöntem 1 çağrılıyor

Bu düğme Click olay işleyicisi, yukarıda açıklanan yöntemi çağırmak için Android örnek uygulamasında bulunabilir:

GetButton.Click += async (sender, e) => {

    Task<int> sizeTask = DownloadHomepage();

    ResultTextView.Text = "loading...";
    ResultEditText.Text = "loading...\n";

    // await! control returns to the caller
    var intResult = await sizeTask;

    // when the Task<int> returns, the value is available and we can display on the UI
    ResultTextView.Text = "Length: " + intResult ;
    // "returns" void, since it's an event handler
};

Notlar:

  • Anonim temsilcinin zaman uyumsuz anahtar sözcük öneki vardır.
  • Zaman uyumsuz yöntem Downloadana sayfası <> , sizetask değişkeninde depolanan bir görev int 'i döndürür.
  • Kod, sizeTask değişkeninde bekler. Bu , yöntemin askıya alındığı ve denetimin, zaman uyumsuz görev kendi iş parçacığında bitene kadar çağırma koduna döndürüldüğü konumdur.
  • Görev, bu görevin oluşturulduğu görev, yöntemin ilk satırında oluşturulduğunda duraklamaz . Await anahtar sözcüğü, yürütmenin duraklatıldığı konumu belirtir.
  • Zaman uyumsuz görev tamamlandığında, ıntresult ayarlanır ve yürütme işlemi, bekleme satırına göre orijinal iş parçacığında devam eder.

Zaman uyumsuz yöntemi çağırma 2

İOS örnek uygulamasında örnek, alternatif bir yaklaşımı göstermek için biraz farklı yazılmıştır. Bu örnek, anonim bir temsilci kullanmak yerine async , normal olay işleyicisi gibi atanan bir olay işleyicisini bildirir:

GetButton.TouchUpInside += HandleTouchUpInside;

Olay işleyicisi yöntemi daha sonra burada gösterildiği gibi tanımlanmıştır:

async void HandleTouchUpInside (object sender, EventArgs e)
{
    ResultLabel.Text = "loading...";
    ResultTextView.Text = "loading...\n";

    // await! control returns to the caller
    var intResult = await DownloadHomepage();

    // when the Task<int> returns, the value is available and we can display on the UI
    ResultLabel.Text = "Length: " + intResult ;
}

Bazı önemli noktaları:

  • Yöntemi olarak işaretlenir, async ancak döndürür void . Bu genellikle yalnızca olay işleyicileri için yapılır (Aksi takdirde bir Task veya döndürün Task<TResult> ).
  • awaitYöntemi içindeki anahtar sözcüğü, DownloadHomepageintResultTask<int> göreve başvurmak için bir ara değişken kullandığımız önceki örneğin aksine, bir değişkene () doğrudan atar. Bu , zaman uyumsuz yöntem başka bir iş parçacığında tamamlanana kadar denetimin çağırana döndürüldüğü konumdur.
  • Zaman uyumsuz yöntem tamamlandığında ve döndüğünde, yürütme üzerinde devam eder ve await ardından bir kullanıcı arabirimi pencere öğesinde işlenir.

Özet

Async ve await kullanılması, ana iş parçacığını engellemeden arka plan iş parçacıklarında uzun süre çalışan işlemler üretme için gereken kodu büyük ölçüde basitleştirir. Ayrıca, görev tamamlandığında sonuçlara erişimi kolaylaştırır.

Bu belge, yeni dil anahtar kelimeleri ve Xamarin. iOS ve Xamarin. Android için örneklere genel bir bakış verdi.