Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
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.
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
CancellationTokenSourcenesne oluşturulur. - Örnek
CancellationTokenSource.Token, iptal edilebilir bir zaman uyumsuz yönteme geçirilir. - yöntemi çağrılarak
CancellationTokenSource.Canceliptal 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ü
asynciçerir. - Dönüş türü,
Task<int>çağıran kodun bu yöntemde hesaplanan değereinterişebilmesini sağlar. - Dönüş deyimi bir tamsayı nesnesidir
return exampleInt;; yöntemin döndürmesiTask<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
asyncişaretlenir ancak döndürürvoid. Bu genellikle yalnızca olay işleyicileri için yapılır (aksi takdirde veyaTaskTask<TResult>döndürürdebilirsiniz). awaityöntemindekiDownloadHomepageanahtar sözcük, göreve başvurmak için ara değişken kullandığımızTask<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.
İlişkili Bağlantılar
- Nesillerimizin Git Deyimi olarak geri çağırmalar
- MapKitSearch (iOS) (örnek)
- Zaman uyumsuz programlama
- Zaman Uyumsuz Uygulamanızda İnce Ayarlama (C#)
- Bekle, kullanıcı arabirimi ve kilitlenmeler! Aman tanrım!
- Görevleri tamamlandıkları gibi işleme)
- Görev Tabanlı Zaman Uyumsuz Desen (TAP)
- C# 5'te zaman uyumsuz (Eric Lippert'in blogu) – anahtar sözcüklerin tanıtılması hakkında
