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.
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 Task
yöntem , Task<TResult>
veya void
dö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 await
edildiğ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 await
nası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ğereint
eriş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
async
işaretlenir ancak döndürürvoid
. Bu genellikle yalnızca olay işleyicileri için yapılır (aksi takdirde veyaTask
Task<TResult>
döndürürdebilirsiniz). await
yöntemindekiDownloadHomepage
anahtar 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