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.
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
CancellationTokenSourcenesne 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,
asyncanahtar sözcüğünü içerir. - Dönüş türü,
Task<int>kodun çağrılmasıintBu yöntemde hesaplanabilecek değere erişebilir. - Return ifadesinin
return exampleInt;bir Integer nesnesi olduğu, yöntemin döndürdüğü olgu iseTask<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,
asyncancak döndürürvoid. Bu genellikle yalnızca olay işleyicileri için yapılır (Aksi takdirde birTaskveya döndürünTask<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
awaitardı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.
İlişkili Bağlantılar
- AsyncAwait (örnek)
- Nesimize git ' e kadar geri çağrılar
- Veri (iOS) (örnek)
- HttpClient (iOS) (örnek)
- MapKitSearch (iOS) (örnek)
- Zaman uyumsuz programlama
- Zaman uyumsuz uygulamanızda ince ayar yapma (C#)
- Await, ve UI ve kilitlenmeler! Oh!
- Görevleri tamamlandıklarında işleme)
- Görev Tabanlı Zaman Uyumsuz Desen (TAP)
- C# 5 ' te asynchrony (Eric Lippert blogu) – anahtar sözcüklerin tanıtımı hakkında
