Zaman Uyumsuz İşlemler

Uygulama geliştirirken her şeyin bir sıraya göre olmasına alışmış olabilirsiniz. Ancak bazı işlemlerin diğer işlemlerden bağımsız olması bu işlemleri aynı anda başlatarak zaman kazanmanızı sağlayabilir. Buna ek olarak kullanıcılarınız her seferinde donan ekranlar görsün istemiyorsanız zaman uyumsuz tasarım desenlerine başvurmanız gerekecektir. O zaman hızlıca bakalım zaman uyumsuz işlemler nasıl yapılır.

Öncelikle, zaman uyumsuz işlem adını yazılımcıların daha aşina olduğu ismiyle kullanmaya başlayalım. Asenkron işlemler size daha tanıdık gelecektir. 🙂

Bir kaç yöntem var asenkron işlem yapabilmek için. Bunlara geçmeden bir sınıf üzerinde zaman uyumlu veya senkron işlemimizi tanımlayalım.

Senkron işlemin sonucu.

Senkron işlemin sonucu. İşlemler sırayla çalışıyorlar.

Yukarıdaki kod parçası çalıştığında öncelikle 0 – 10 arasında sayıları yazacak sonra toplam harcadığı süreyi ekleyecek ve sonra aynısı 0 – 5 arasındaki sayılar için yapılacak. Bunları asenkron hale getirmek oldukça basit.

Senkron olan işlemimizi bir Thread içerisine alıyoruz ve Thread objemizin Start methodunu çağırıyoruz. Yaptığımız ufak değişikliğin nasıl bir sonuç çıkardığını kod parçalarının çıktılarına bakarak inceleyelim.

Asenkron İşlemin Sonucu

Asenkron İşlemin sonucu. Görüleceği gibi 0-5 arasındaki sayılar için çalışan işlem daha önce tamamlanmış. Bu işlemlerin bir birlerini beklemeden çalıştıklarını gösteriyor.

Peki bu kadar kolay olmasına karşın neden çoğu uygulama da bu yöntemi kullanmıyoruz. Aslında sebebi çok basit; uygulamamızın daha geliştirilebilir olmasını ve daha kontrol edilebilir olmasını sağlamak için. Asenkron uygulama geliştirmek çoğu zaman karmaşıktır. Verilen örnek kadar kolay bir uygulamada asenkron işlem yapacaksanız yukarıdaki tekniği kullanmanızda hiç bir sıkıntı görmüyorum. Ancak uygulamaların işlem kullarının artması uygulama içindeki kompleksliği arttıracaktır. Bunun yerine belirli denenmiş kuralları kullanmak fayda sağlayacak ve bazı noktaları garanti etmiş olacaksınız. Bununla ilgili detayları daha sonraki yazımda paylaşıyor ve güzel bir örnek yapıyor olacağım.

Örneğimizi şimdi önerilen tarzdaki bir yapıya çevirelim.

Kod incelendiğinde ilk göze çarpacak şey delegate kullanılıyor olması. Bu kod daha derli toplu durmasının yanında ilk kısımda olan koda göre geliştirilmeye çok daha açıktır. Örneğin işlem bittiğinde ki yazı bize gelsin ve üzerinde işlem yapıp sonrasında ekrana gösterelim isterseniz. Delegate’ i güncellemeniz ve sonrasında methodu güncellemeniz yeterlidir.

IAsyncResult kullanarak yapılan geliştirmeler, geliştiriciye ek olarak bir Callback method sağlamaktadır. Bunun faydası işlem tamamlandığında bu method’ un çağırılmasını sağlayarak işlem tamamlandıktan sonra yapacağınız işlemler için size fırsat sağlamasıdır.

Son olarak ekleyeceğim bir özellik daha var sonrasında kodun son halini paylaşıyor olacağım. 🙂 Bu ek özellik aslında işinize çok nadir yarayabilir ancak yine de bilinmesinde fayda olduğunu düşünüyorum. Bir asenkron işlemi aynı anda farklı parametrelerle birden fazla çağırmanız gerekebilir. Bunun için ek bir parametre bulunmaktadır. Bu parametre için gönderdiğiniz tekil değerler size hangi işlemin bittiğini ve hangi işlemin devam ettiği hakkında fikir verebilir. Bu özellikte dahil olmak üzere bütün kodun son halini paylaşıyorum. Daha sonraki yazılarda mimari açıdan daha uygun olacağını düşündüğüm bir asenkron işlem tasarım deseni hakkında bilgi vermeye çalışacağım.

 

This article has 1 comments

  1. Pingback: AsyncOperationManager kullanımı | Fatih Tatoğlu

Yorumlayın