Zaman Uyumsuz Desteğe Genel Bakış

C# 5, zaman uyumsuz programlamayı basitleştirmek için iki anahtar sözcük kullanıma sunulmuştur: async ve await. Bu anahtar sözcükler, uzun süre çalışan işlemleri (ağ erişimi gibi) başka bir iş parçacığında yürütmek ve tamamlandığında 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 zaman uyumsuz ve await'yi destekler. Bu belgede açıklamalar ve Xamarin ile yeni söz dizimini kullanma örneği sağlanır.

Xamarin'in Async desteği Mono 3.0 temeli üzerine kurulmuştur ve API profilini Silverlight'ın Mobil kullanımı kolay sürümünden .NET 4.5'in mobil kullanımı kolay sürümüne yükseltmektedir.

Genel bakış

Bu belgede yeni zaman uyumsuz ve await anahtar sözcükleri tanıtılarak Xamarin.iOS ve Xamarin.Android'de zaman uyumsuz yöntemler uygulayan bazı basit örnekler açıklanmış olur.

C# 5'in yeni zaman uyumsuz özellikleri (çok sayıda örnek ve farklı kullanım senaryoları dahil) hakkında daha ayrıntılı bilgi için Zaman uyumsuz programlama makalesine 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ğinde bulunur ve ardından kullanıcı arabirimini indirilen html ve karakter sayısıyla güncelleştirir

Xamarin'in zaman uyumsuz desteği Mono 3.0 temeli üzerine kurulmuştur ve API profilini Silverlight'ın mobil kullanıma uygun sürümünden .NET 4.5'in mobil uyumlu sürümüne yükseltmektedir.

Gereksinimler

C# 5 özellikleri için Xamarin.iOS 6.4 ve Xamarin.Android 4.8'de bulunan Mono 3.0 gerekir. Mono, Xamarin.iOS, Xamarin.Android ve Xamarin.Mac'inizi yükseltmeniz istenir.

Zaman uyumsuz &await kullanma

async ve await 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ırmak için Görev Paralel Kitaplığı ile birlikte çalışan yeni C# dil özellikleridir.

async

Bildirim

async anahtar sözcüğü, zaman uyumsuz olarak çalıştırabilen kod içerdiğini belirtmek için bir yöntem bildirimine (veya bir lambda veya anonim yönteme) yerleştirilir, yani çağıranın iş parçacığını engellemez.

ile async işaretlenmiş bir yöntem en az bir await ifadesi veya deyimi içermelidir. Yönteminde hiçbir await deyim yoksa zaman uyumlu olarak çalışır (değiştirici olmadığı async gibi). Bu, derleyici uyarısına da neden olur (ancak hataya neden olmaz).

Dönüş Türleri

Zaman uyumsuz bir Taskyöntem , Task<TResult> veya voiddöndürmelidir.

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

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

void Dönüş türü çoğunlukla bunu gerektiren olay işleyicileri için kullanılır. Void döndüren zaman uyumsuz yöntemleri çağıran kod, sonuçta olamaz await .

Parametreler

Zaman uyumsuz yöntemler veya out parametreleri bildiremezref.

bekleme

await işleci, zaman uyumsuz olarak işaretlenmiş bir yöntemin içindeki bir Göreve uygulanabilir. Yöntemin bu noktada yürütmeyi durdurmasına ve görev tamamlanana kadar beklemesine neden olur.

Await kullanılması çağıranın iş parçacığını engellemez; bunun yerine denetim arayana döndürülür. Bu, çağıran iş parçacığının engellenmediği anlamına gelir, bu nedenle örneğin kullanıcı arabirimi iş parçacığı bir görev beklerken engellenmez.

Görev tamamlandığında, yöntem kodda aynı noktada yürütmeye devam eder. Bu, try-catch-finally bloğunun deneme kapsamına geri dönmeyi içerir (varsa). await bir catch veya finally bloğunda kullanılamaz.

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 awaitedildiğinde oluşturulur. Bu özel durumlar bir try-catch bloğu içinde yakalanabilir ve işlenebilir.

İptal

Tamamlanması uzun süren zaman uyumsuz yöntemler iptali desteklemelidir. Genellikle iptal aşağıdaki gibi çağrılır:

  • Bir CancellationTokenSource nesne oluşturulur.
  • Örnek CancellationTokenSource.Token , iptal edilebilir bir zaman uyumsuz yönteme geçirilir.
  • yöntemi çağrılarak CancellationTokenSource.Cancel iptal istenir.

Görev daha sonra kendisini iptal eder ve iptali kabul eder.

İptal hakkında daha fazla bilgi için bkz . Zaman Uyumsuz Uygulamanızın İnce Ayarını Yapma (C#).

Örnek

Mobil uygulamalarda ve çalışma örneğini async await görmek için örneği indirin (hem iOS hem de Android için). Örnek kod bu bölümde daha ayrıntılı olarak açıklanmıştır.

Zaman uyumsuz yöntem yazma

Aşağıdaki yöntemde bir async yöntemin ed göreviyle awaitnasıl kodlandığı gösterilmektedir:

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 noktaları not edin:

  • Yöntem bildirimi anahtar sözcüğünü async içerir.
  • Dönüş türü, Task<int> çağıran kodun bu yöntemde hesaplanan değere int erişebilmesini sağlar.
  • Dönüş deyimi bir tamsayı nesnesidir return exampleInt; ; yöntemin döndürmesi Task<int> dil geliştirmelerinin bir parçasıdır.

Zaman uyumsuz yöntem çağırma 1

Bu düğme tıklaması 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 ön eki vardır.
  • DownloadHomepage zaman uyumsuz yöntemi sizeTask değişkeninde depolanan bir Task<int> döndürür.
  • Kod sizeTask değişkeninde bekler. Bu , yönteminin askıya alındığı ve zaman uyumsuz görev kendi iş parçacığında bitene kadar denetimin çağıran koda döndürülür.
  • Yürütme, görevin orada oluşturulmasına rağmen, yöntemin ilk satırında görev oluşturulduğunda duraklatılmaz. await anahtar sözcüğü, yürütmenin duraklatıldığı konumu belirtir.
  • Zaman uyumsuz görev tamamlandığında, intResult ayarlanır ve yürütme özgün iş parçacığında await satırından devam eder.

Zaman uyumsuz yöntem çağırma 2

iOS örnek uygulamasında örnek, alternatif bir yaklaşım göstermek için biraz farklı yazılır. Anonim bir temsilci kullanmak yerine bu örnek, normal bir async olay işleyicisi gibi atanmış bir olay işleyicisi bildirir:

GetButton.TouchUpInside += HandleTouchUpInside;

Daha sonra olay işleyici yöntemi burada gösterildiği gibi tanımlanı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 async işaretlenir ancak döndürür void . Bu genellikle yalnızca olay işleyicileri için yapılır (aksi takdirde veya Task Task<TResult> döndürürdebilirsiniz).
  • await yöntemindeki DownloadHomepage anahtar sözcük, göreve başvurmak için ara değişken kullandığımız Task<int> önceki örnekten farklı olarak bir değişkene (intResult) 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 tamamlanıp döndürdüğünde await , yürütme devam eder; bu da tamsayı sonucunun döndürüldüğü ve ardından ui pencere öğesinde işlendiği anlamına gelir.

Özet

Zaman uyumsuz ve await kullanmak, ana iş parçacığını engellemeden arka plan iş parçacıklarında uzun süre çalışan işlemleri oluşturmak için gereken kodu büyük ölçüde basitleştirir. Ayrıca, görev tamamlandığında sonuçlara erişmeyi de kolaylaştırır.

Bu belgede hem Xamarin.iOS hem de Xamarin.Android için yeni dil anahtar sözcüklerine ve örneklerine genel bir bakış verilmiştir.