Windows 8’de Arka plan Görevleri

Worker   Windows 8’de geliştirdiğiniz uygulamaların yaşam döngüsünü bir önceki makalemde sizlerle paylaşmıştım. Uygulamaların yaşam döngüsü hakkında detaylı bilgi edindikten sonra eminim ki masaüstü uygulamalarıyla karşılaştırmışsınızdır. İlk aklınıza gelecek soru eminim ki gerçekleştirdiğiniz düzenli/uzun soluklu işlerde kullanıcının bir başka uygulamayı aktif hale getirdiğinde ne olacağıdır. En basitinden bir e-mail uygulaması yazdığınızı düşünün, bu uygulama kullanıcı tarafından aktif edilmesi bile mailleri kontrol ederek kullanıcıyı bilgilendirmelidir. Bir başka örnek facebook ya da twitter gibi sosyal ortamlardan gelen mesajların düzenli olarak kontrol edilerek size iletilmesi olabilir. Bu makalemde Windows 8 uygulamalarınızda arka plan işlemlerini nasıl gerçekleştirebileceğinizi sizlerle paylaşacağım.

   Öncelikle, Windows 8 ile birlikte Microsoft’un düşük güç kullanımına çok önem verdiğini fark etmişsinizdir. Windows 8’in bu işlemci zamanı ve hafıza kullanımındaki cimriliği sayesinde mobil sistemlerde daha uzun bir pil ömrüne sahip olabiliyoruz. Üstelik bu cimriliğin tek getirisi sadece uzun pil ömrü de değil… Giderek incelen mobil sistemler henüz bir masaüstü sistem kadar güçlü bir işlemci mimarisine sahip değil, dolayısıyla masaüstü bir sistemden beklediğimiz çoklu görev ve arka plan işlemlerinin aynı anda ve aynı performansla mobil sistemlerde de gerçekleşmesini beklemek şu an için doğru olmayacaktır. Dolayısıyla da yukarıda örneklediğim görevleri gerçekleştirecek uygulamalar masaüstündeki benzerlerine göre önemli mimari farklılıklara sahip olmalıdırlar.

   Windows 8; dosya yükleme/indirme, müzik dinleme, cihazlar arası veri senkronizasyonu gibi temel bazı görevlerin sunduğu API’ler yardımıyla arka planda yapılabilmesine olanak sağlamakta. Buna ek olarak; başlat menüsündeki karoların güncellenmesi, planlı bilgilendirmeler ve arka plan görevleri başlıkları altında gruplayabileceğimiz ek yapılarda sunulmaktadır. Sıraladığım bu arka plan görevlerinin her birini ayrı ayrı sizlerle paylaşmayı planlamakla birlikte, bu makalemde önceliği arka plan görevlerine vereceğim.

   Windows 8 arka plan görevleri olabildiğince hafif kod parçaları olarak düşünülmelidir ve pek çoklarınızın tahmin ettiğinden farklı olarak ne işletim sisteminin açılmasıyla birlikte otomatik olarak başlar ne de sistem kapanana kadar açık kalır; çünkü böylesi bir senaryo işlemci ve hafıza kullanımını dolayısıyla da güç tüketimini olumsuz etkileyecektir. Bunun yerine arka plan görevlerinin başlatılması belirli bir tetiklemeye ve bir dizi koşula bağlanmış ve kısıtlı bir işlemci zamanını kullanmalarına izin verilmiştir. Yani bir arka plan görevi örneğin; kullanıcı cihaz başındayken fakat sadece aktif bir internet bağlantısı bulunduğunda başlatılabilir. Bir başka örnek; bir arka plan görevi bir sms mesajı geldiğinde başlatılabilir ve sms içeriğinde reklam olmasına göre sms’i bloklayan kodumuz çalışabilir.

   Arka plan görevleri bir sınıf kütüphanesi içerisinde yer alacak şekilde tasarlanmıştır. Dolayısıyla da çalışabilmeleri için bir host uygulamaya ihtiyaçları vardır. Windows 8’de arka plan görevlerimizin çalışmasından BackgroundTaskHost.exe uygulaması sorumludur. Buna istisna olarak PushNotificationTrigger türü ile tetiklenen görevlerde işletim sistemin sunduğu uygulama yerine kendimiz de bir host uygulama belirtebiliriz. Farklı bir istisna olarak, ControlChannelTrigger türü ile tetiklenen görevler için ise işletim sistemince sunulan host uygulamasının kullanılmasına izin verilmemektedir ve görev oluşturulurken bir başka host uygulama verilmelidir.

    Arka plan görevlerine kısıtlı sistem kaynağı veriliyor olmasına karşın buna tek istisna kilit ekranında yer alanlardır. Kilit ekranı kullanıcının devamlı göz önünde bulunması nedeniyle bu istisnai durum söz konusu. Son kullanıcı her zaman için kilit ekranında güncel veriyi görmek isteyecektir. Dolayısıyla kilit ekranında yer alan görevler diğerlerine göre daha fazla işlemci zamanı, daha fazla sistem kaynağı kullanmak zorunda kalacaktır. Öte yandan, kilit ekranında sonsuz sayıda göreve izin vermek sistem kaynaklarının hatalı ve bilinçsizce tüketilmesine neden olacağından en fazla 7 görevin aynı anda kilit ekranında bulunmasına izin verilmiştir. Kullanıcı hangi görevlerin kilit ekranında bulunacağına bir sistem arayüzünden karar verebileceği gibi geliştirdiğimiz uygulamalar da kilit ekranında yer alabilmeyi kullanıcıdan talep edebilirler. Bu isteğin kullanıcıya iletilmesi için BackgroundExecutionManager kullanılmalıdır.

   Bir uygulama istediği zaman Windows.ApplicationModel.Background isim uzayı altında tanımlı olan BackgroundTaskBuilder sınıfı yardımıyla IBackgroundTask arayüzüne uygun sınıfını/sınıflarını arka plan görevi olarak tanımlayabilir. Tanımlama sırasında tetikleme olayı ve varsa koşulları yanında çalıştırılacak olan görev sınıfının tam adı da verilmelidir. Bu makalemde daha çok arka plan görevi konseptine değinmeyi amaçladığım için BackgroundTaskBuilder yardımıyla programınız içerisinden nasıl bir arka plan görevi oluşturabileceğinizi bir sonraki makalemde sizlerle paylaşacağım.

   Arka plan görevlerinin bir tetikleme ile başladığından bahsetmiştim. Bu tetiklemeler sistem tetiklemeleri, zamanlayıcı tetiklemeleri, Push Notification tetiklemeleri, kontrol kanalı tetiklemeleri, bakım tetiklemeleri gibi farklı farklı gruplar altında bulunmaktadır. Aşağıda, muhtemelen en sık kullanacağınız tetikleme türlerinden SystemTriggerType enum’u içerisinde tanımlı olan ve bir arka plan görevinin başlamasında kullanılabilecek olan tetikleyici olayları açıklamalarıyla birlikte bulabilirsiniz;

Değer Açıklama
Invalid Geçersiz bir tetikleme
SmsReceived Sisteme bağlı bir GSM cihazına yeni bir SMS ulaştığında arka plan tetiklenecektir
UserPresent Sistemde aktif bir kullanıcı olduğun arka plan görevi tetiklenecektir
UserAway Aktif kullanıcı sistemde olmadığında arka plan görevi tetiklenecektir
NetworkStateChange Network bağlantısı ile ilgili bir değişiklik olduğunda arka plan görevi tetiklenecektir. Bu değişikli bağlantının sağlanması/gitmesi olabileceği gibi ücretlendirme değişikliği de olabilir.
ControlChannelReset Kontrol kanalı sıfırlandığında arka plan görevi tetiklenecektir
InternetAvailable Internet bağlantısı olduğunda arka plan görevi tetiklenecektir
SessionConnected Sistemde bir oturum bağlandığında arka plan görevi tetiklenecektir
ServicingComplete Mevcut bir uygulama güncellendiğinde arka plan görevi tetiklenecektir
LockScreenApplicationAdded Kilit ekranına yeni bir karo eklendiğinde arka plan görevi tetiklenecektir
LockScreenApplicationRemoved Mevcut bir karo kilit ekranından kaldırıldığında arka plan görevi tetiklenecektir
TimeZoneChange Sistemde tanımlı zaman dilimi değiştiğinde arka plan görevi tetiklenecektir
OnlineIdConnectedStateChange Tanımlı olan bir Microsoft hesabı değiştiğinde arka plan görevi tetiklenecektir

 

   Benzer şekilde aşağıda, SystemConditionType enum’u içerisinde tanımlı olan ve bir arka plan görevinin başlamasında kullanılabilecek olan koşulları bulabilirsiniz;

Değer Açıklama
Invalid Geçersiz bir koşul
UserPresent Arka plan görevinin sistemde bir kullanıcı bulunduğunda çalışması koşuludur
UserNotPresent Arka plan görevinin sistemde bir kullanıcı bulunmadığında çalışması koşuludur
InternetAvailable Arka plan görevinin internet bağlantısı olduğunda çalışması koşuludur
InternetNotAvailable Arka plan görevinin internet bağlantısı olmadığında çalışması koşuludur
SessionConnected Arka plan görevinin bir kullanıcı oturumu bulunduğunda çalışması koşuludur
SessionDisconnected Arka plan görevinin bir kullanıcı oturumu koptuğunda çalışması koşuludur

 

   SystemTriggerType ile ilgili düşmem gereken önemli bir not; burada yer alan tetikleme seçeneklerinin hepsi tüm arka plan görevlerince kullanılamamaktadır. Sistem genelinde tetiklenebilen bu sistem tetikleme türlerinden InternetAvailable, NetworkStateChange, OnlineIdConnectedStateChange, SmsReceived ve TimeZoneChange tetikleme türleri tüm arka plan görevlerince kullanılabilmesine karşın UserPresent, UserAway, ControlChannelReset ve SessionConnected tetikleme türleri sadece kilit ekranında yer alan görevler tarafından kullanabilmektedir. Bu tetikleme türleri kilit ekranında yer almayan görevlerce kullanılmak istediğinde “erişim reddedildi” (access denied) hatası alacaklardır. LockScreenApplicationAdded ve LockScreenApplicationRemoved sistem tetikleme türleri ise görev kilit ekranında olsun ya da olmasın kullanılabilmektedir.

   Bakım tetiklemesi (Maintenance Trigger) cihazın bir AC güç kaynağına bağlanması sonucu oluşmaktadır. Adından da anlaşılabileceği gibi bu tetikleme türündeki amaç yüksek güç tüketimi olan ve yoğun işlemci/ram tüketen bakım işlerinin kullanıcıyı etkilemeden ve sistem bir güç kaynağına bağlı iken yapılmasıdır.

   Zaman tetiklemesi (Time Trigger) işletim sisteminin belirlediğiniz aralıklarla görevinizi tetiklemesi sonucu oluşmaktadır. Bu tetikleme türünü belirli aralıklarla gerçekleştirmek istediğiniz işleriniz için kullanabilirsiniz.

   Makalemin başlarında da belirttiğim gibi Windows 8 arka plan görev mimarisi tasarlanırken düşük güç tüketimi, işlemci/ram ve network kullanımına özen gösterildi. Bu sebeple yukarıda sıraladığım tetikleme seçeneklerinden birisiyle tetiklenen bir arka plan görevi sonsuza dek çalışamaz. Normal bir arka plan görevine her 2 saatte bir yenilecek olan 1 saniyelik işlemci zamanı (evet, yanlış okumadınız 🙂 ), kilit ekranında yer alan bir arka plan görevine ise her 15 dakikada 2 saniyelik işlemci zamanı verilmektedir. İçinizi rahatlatır mı bilmem; burada bahsettiğimiz 1 saniyelik zaman diliminin 1 işlemci saniyesi olduğunun altını çizmeliyim, bu bizlerin günlük yaşamda kullandığımız 1 saniyeden farklıdır… 3G ve WiFi bağlantılarının da yüksek güç tüketimi oluşturabilmesi nedeniyle aynı CPU kullanımında olduğu gibi network kullanımında da bir sınırlama söz konusudur. Bu değer kullanılan network arayüzünün tükettiği enerjiye göre değişkenlik göstermektedir. Cihazın bir güç kaynağına bağlı olduğu durumlarda ise network kullanımında bir sınır bulunmayacaktır.

   Son olarak; bir uygulama sistemden kaldırıldığında tanımlamış olduğu tüm arka plan görevleri de işletim sistemince otomatik olarak silinecektir.

Fatih Boy

Ankara'da yaşayan Fatih, bir kamu kurumunda danışman olarak çalışmaktadır. ALM süreçleri, kurumsal veri yolu sistemleri, kurumsal altyapı ve yazılım geliştirme konularında destek vermektedir. Boş zamanlarında açık kaynak kodlu projeler geliştirmeyi ve bilgisini yazdığı makalelerle paylaşmayı seven Fatih, aynı zamanda Visual C# ve Visual Studio teknolojileri konusundan Microsoft tarafından altı yıl üst üste MVP (En Değerli Profesyonel) ödülüne layık görülmüştür. İş hayatı boyunca masaüstü uygulamaları, web teknolojileri, akıllı istemciler gibi konularda Asp.Net, Php, C#, Java programlama dilleri ve MySql, MsSql ve Oracle gibi veritabanı yönetim yazılımları ile çalışmıştır. İngilizce ve Türkçe olarak yayınlanan makalelerini gerek İngilizce bloğunda, gerekse de Türkçe bloğunda bulabileceğiniz gibi web sitesinden de açık kaynak kodlu geliştirdiği yazılımlarına ulaşabilirsiniz. vCard - Twitter - Facebook - Google+

2 yorum

Bir Cevap Yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir