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.
Not
Bu kitap 2016 baharında yayımlanmıştır ve o zamandan beri güncellenmemiştir. Kitapta değerli kalan çok şey vardır, ancak bazı malzemeler eskidir ve bazı konular artık tamamen doğru veya eksiksiz değildir.
Grafik kullanıcı arabirimi, kullanıcı girişi olaylarına sırayla yanıt vermelidir. Bu, kullanıcı girişi olaylarının tüm işlemlerinin genellikle ana iş parçacığı veya UI iş parçacığı olarak adlandırılan tek bir iş parçacığında gerçekleşmesi gerektiğini gösterir.
Kullanıcılar grafik kullanıcı arabirimlerinin yanıt vermesini bekler. Bu, bir programın kullanıcı girişi olaylarını hızlı bir şekilde işlemesi gerektiği anlamına gelir. Bu mümkün değilse, işlemenin ikincil yürütme iş parçacıklarına yeniden temsilci olarak belirtilmesi gerekir.
Bu kitaptaki birkaç örnek program sınıfını kullanmıştı WebRequest . Bu sınıfta BeginGetResponse yöntemi, tamamlandığında geri çağırma işlevini çağıran bir çalışan iş parçacığı başlatır. Ancak bu geri çağırma işlevi çalışan iş parçacığında çalıştırıldığından, programın kullanıcı arabirimine erişmek için yöntemini çağırması Device.BeginInvokeOnMainThread gerekir.
Not
Xamarin.Formsprogramları, İnternet üzerinden dosyalara erişmek yerine WebRequest kullanmalıdırHttpClient. HttpClient zaman uyumsuz işlemleri destekler.
.NET ve C# ile zaman uyumsuz işlemeye daha modern bir yaklaşım sağlanır. Bu, ve sınıflarını Task ve ve System.Threading.Tasks ad alanları içindeki System.Threading diğer türlerin yanı sıra C# 5.0 async ve await anahtar sözcüklerini Task<TResult> içerir. Bu bölümün üzerinde durduğunuz konu budur.
Geri aramalardan beklemeye
Sınıfın Page kendisi uyarı kutularını görüntülemek için üç zaman uyumsuz yöntem içerir:
DisplayAlertbirTasknesne döndürürDisplayAlertbirTask<bool>nesne döndürürDisplayActionSheetbirTask<string>nesne döndürür
Task Nesneler, bu yöntemlerin TAP olarak bilinen Görev Tabanlı Zaman Uyumsuz Deseni uyguladığını gösterir. Bu Task nesneler yönteminden hızlı bir şekilde döndürülür. Task<T> Dönüş değerleri, görev tamamlandığında türünde TResult bir değerin kullanılabilir olacağını belirten bir "promise" oluşturur. Task Dönüş değeri, tamamlanacak ancak değer döndürülmeyecek zaman uyumsuz bir eylemi gösterir.
Tüm bu durumlarda, Task kullanıcı uyarı kutusunu kapattığında tamamlanır.
Geri çağırmalar içeren bir uyarı
AlertCallbacks örneği, geri çağırma yöntemlerini kullanarak dönüş nesnelerinin ve Device.BeginInvokeOnMainThread çağrıların nasıl işleneceğini Task<bool> gösterir.
Lambda içeren bir uyarı
AlertLambdas örneği, işleme Task ve Device.BeginInvokeOnMainThread çağrılar için anonim lambda işlevlerinin nasıl kullanılacağını gösterir.
await ile bir uyarı
Daha basit bir yaklaşım, C# 5'te tanıtılan ve await anahtar sözcüklerini içerirasync. AlertAwait örneği kullanımlarını gösterir.
Hiçbir şey olmadan bir uyarı
zaman uyumsuz yöntem yerine Task<TResult>döndürürseTask, zaman uyumsuz görevin ne zaman tamamlanmasını bilmesi gerekmiyorsa programın bu tekniklerden herhangi birini kullanması gerekmez. NothingAlert örneği bunu gösterir.
Program ayarlarını zaman uyumsuz kaydetme
SaveProgramChanges örneği, yöntemi geçersiz kılmadan program ayarlarını değiştirirken kaydetmek için yönteminin Application OnSleep kullanımını SavePropertiesAsync gösterir.
Platformdan bağımsız zamanlayıcı
Platformdan bağımsız bir zamanlayıcı oluşturmak için kullanabilirsiniz Task.Delay . TaskDelayClock örneği bunu gösterir.
Dosya girişi/çıkışı
Geleneksel olarak dosya G/Ç desteğinin kaynağı .NET System.IO ad alanı olmuştur. Bu ad alanı içindeki bazı yöntemler zaman uyumsuz işlemleri desteklese de, çoğu desteklemez. Ad alanı, karmaşık dosya G/Ç işlevleri gerçekleştiren birkaç basit yöntem çağrısını da destekler.
İyi ve kötü haber
Tarafından Xamarin.Forms desteklenen tüm platformlar, uygulamanın yerel depolama alanını (uygulamaya özel depolama alanı) destekler.
Xamarin.iOS ve Xamarin.Android kitaplıkları, Xamarin'in bu iki platform için açıkça uyarlanmış bir .NET sürümünü içerir. Bunlar, bu iki platformda uygulama yerel depolaması ile dosya G/Ç gerçekleştirmek için kullanabileceğiniz sınıfları System.IO içerir.
Ancak, bir PCL'de Xamarin.Forms bu System.IO sınıfları ararsanız, bunları bulamazsınız. Sorun, Microsoft'un Windows Çalışma Zamanı API için dosya G/Ç'yi tamamen yenilemiş olmasıdır. Windows 8.1, Windows Phone 8.1 ve Evrensel Windows Platformu hedefleyen programlar dosya G/Ç için kullanmazSystem.IO.
Bu, (ilk olarak Bölüm 9'da ele alınan) öğesini kullanmanız DependencyService gerektiği anlamına gelir. Dosya G/Ç'sini uygulamak için platforma özgü API çağrıları.
Not
Taşınabilir Sınıf Libaries,.NET Standard 2.0 kitaplıklarıyla değiştirilmiştir ve .NET Standard 2.0 tüm Xamarin.Forms platformlar için türleri desteklerSystem.IO. Artık çoğu dosya G/Ç görevi için bir DependencyService kullanılması gerekmez. Dosya G/Ç'ye Xamarin.Forms daha modern bir yaklaşım için bkz. dosya işleme.
Platformlar arası dosya G/Ç'de ilk atış
TextFileTryout örneği, tüm platformlarda dosya G/Ç ve bu arabirimin uygulamaları için bir IFileHelper arabirim tanımlar. Ancak Windows Çalışma Zamanı uygulamaları, Windows Çalışma Zamanı dosya G/Ç yöntemleri zaman uyumsuz olduğundan bu arabirimdeki yöntemlerle çalışmaz.
Windows Çalışma Zamanı dosya G/Ç'sini kabul etme
Windows Çalışma Zamanı altında çalışan programlar, uygulama yerel depolaması dahil Windows.Storage olmak üzere dosya G/Ç için ve Windows.Storage.Streams ad alanları sınıflarını kullanır. Microsoft, kullanıcı arabirimi iş parçacığının engellenmesini önlemek için 50 milisaniyeden fazla gerektiren tüm işlemlerin zaman uyumsuz olması gerektiğini belirlediğinden, bu dosya G/Ç yöntemleri çoğunlukla zaman uyumsuz olur.
Bu yeni yaklaşımı gösteren kod, diğer uygulamalar tarafından kullanılabilmesi için bir kitaplıkta olacaktır.
Platforma özgü kitaplıklar
Yeniden kullanılabilir kodu kitaplıklarda depolamak avantajlıdır. Yeniden kullanılabilir kodun farklı parçaları tamamen farklı işletim sistemleri için olduğunda bu açıkça daha zordur.
Xamarin.FormsBook.Platform çözümü tek bir yaklaşımı gösterir. Bu çözüm yedi farklı proje içerir:
- Xamarin.FormsBook.Platform, normal Xamarin.Forms bir PCL
- Xamarin.FormsiOS sınıf kitaplığı Book.Platform.iOS
- Xamarin.FormsBook.Platform.Android, android sınıf kitaplığı
- Xamarin.FormsBook.Platform.UWP, Evrensel Windows sınıf kitaplığı
- Xamarin.FormsBook.Platform.WinRT, tüm Windows platformları için ortak olan kod için paylaşılan bir proje
Tek tek tüm platform projelerinin (Book.Platform.WinRT hariç) Book.Platform'a Xamarin.Formsreferansları vardır.Xamarin.Forms Üç Windows projesinin Book.Platform.WinRT'ye Xamarin.Formsbir başvurusu vardır.
Tüm projeler, uygulama çözümündeki bir proje tarafından doğrudan başvurulmazsa kitaplığın yüklendiğinden emin olmak için statik Toolkit.Init bir Xamarin.Forms yöntem içerir.
Xamarin.FormsBook.Platform projesi yeni IFileHelper arabirimi içerir. Artık tüm yöntemlerin sonekleri ve dönüş Task nesneleri olan Async adları vardır.
Xamarin.FormsBook.Platform.WinRT projesi Windows Çalışma Zamanı sınıfını içerirFileHelper.
Xamarin.FormsBook.Platform.iOS projesi iOS sınıfını FileHelper içerir. Bu yöntemlerin artık zaman uyumsuz olması gerekir. Yöntemlerden bazıları ve içinde StreamWriter tanımlanan yöntemlerin zaman uyumsuz sürümlerini kullanır: WriteAsync ve StreamReaderReadToEndAsync. Diğerleri yöntemini kullanarak bir sonucu nesneye Task FromResult dönüştürür.
Xamarin.FormsBook.Platform.Android projesi, Android için benzer FileHelper bir sınıf içerir.
Xamarin.FormsBook.Platform projesi, nesnesinin kullanımını DependencyService kolaylaştıran bir FileHelper sınıf da içerir.
Bu kitaplıkları kullanmak için bir uygulama çözümünün Book.Platform çözümündeki Xamarin.Formstüm projeleri içermesi ve uygulama projelerinin her birinin Book.Platform'daki Xamarin.Formsilgili kitaplığa bir başvurusu olması gerekir.
TextFileAsync çözümü, Book.Platform kitaplıklarının Xamarin.Formsnasıl kullanılacağını gösterir. Projelerin her birinin çağrısı vardır Toolkit.Init. Uygulama zaman uyumsuz dosya G/Ç işlevlerini kullanır.
Arka planda tutma
Windows Çalışma Zamanı sınıfındaki ve yöntemleri gibi WriteFileAsync birden çok zaman uyumsuz yönteme çağrı yapan kitaplıklardaki FileHelper yöntemler, kullanıcı arabirimi iş parçacığına geri dönmekten kaçınmak için yöntemi kullanılarak ConfigureAwait biraz daha verimli hale getirilebilir.ReadFileASync
Kullanıcı arabirimi iş parçacığını engellemeyin!
Bazen veya özelliğini yöntemler üzerinde kullanarak Result kullanmaktan ContinueWith await kaçınmak cazip olabilir. Kullanıcı arabirimi iş parçacığını engelleyebilir, hatta uygulamayı kilitleyebilir.
Kendi beklenebilir yöntemleriniz
Bazı kodları yöntemlerden birine Task.Run geçirerek zaman uyumsuz olarak çalıştırabilirsiniz. Ek yükün bir kısmını işleyen zaman uyumsuz bir yöntem içinde çağırabilirsiniz Task.Run .
Task.Run Çeşitli desenler aşağıda açıklandı.
Temel Mandelbrot seti
Mandelbrot setini gerçek zamanlı olarak çizmek için. Xamarin.Forms Araç seti kitaplığı, ad alanında bulunana benzer bir Complex yapıya System.Numerics sahiptir.
MandelbrotSet örneğinin arka planda kod dosyasında temel siyah beyaz Mandelbrot kümesini hesaplayan ve bit eşlem üzerine koymak için kullanan BmpMaker bir yöntemi vardırCalculateMandeblotAsync.
İlerlemeyi işaretleme
Zaman uyumsuz bir yöntemden ilerleme durumunu bildirmek için, bir Progress<T> sınıfın örneğini oluşturabilir ve zaman uyumsuz yönteminizi türünde IProgress<T>bir bağımsız değişkene sahip olacak şekilde tanımlayabilirsiniz. Bu, MandelbrotProgress örneğinde gösterilmiştir.
İşi iptal etme
Ayrıca, iptal edilebilir olması için zaman uyumsuz bir yöntem de yazabilirsiniz. adlı CancellationTokenSourcebir sınıfla başlarsınız. Token özelliği türünde CancellationTokenbir değerdir. Bu, zaman uyumsuz işleve geçirilir. Program, zaman uyumsuz işlevi iptal etmek için yöntemini CancellationTokenSource (genellikle kullanıcının bir eylemine yanıt olarak) çağırırCancel.
Zaman uyumsuz yöntem, özelliği CancellationToken ise özelliğini düzenli aralıklarla denetleyebilir IsCancellationRequested ve çıkış yapabilir veya yalnızca yöntemini çağırabilirThrowIfCancellationRequested; bu durumda yöntem ile OperationCancelledExceptionsona erertrue.
MandelbrotCancellation örneği, iptal edilebilir bir işlevin kullanımını gösterir.
Bir MVVM Mandelbrot
MandelbrotXF örneği daha kapsamlı bir kullanıcı arabirimine sahiptir ve çoğunlukla ve MandelbrotModel MandelbrotViewModel sınıflarını temel alır:
Web'e geri dön
WebRequest Bazı örneklerde kullanılan sınıf, Zaman Uyumsuz Programlama Modeli veya APM adlı eski moda bir zaman uyumsuz protokol kullanır. Sınıfındaki yöntemlerden birini kullanarak böyle bir sınıfı modern TAP protokolüne FromAsync TaskFactory dönüştürebilirsiniz. ApmToTap örneği bunu gösterir.
