Windows Phone

Eşzamansız (Asenkron) Programlama

Merhaba! Bu yazımda size C# ile eşzamansız programlama (asynchronous programming) ve eşzamansız programlamada kontrol akışının (control flow) nasıl sağlandığından bahsedeceğim. Bana kalırsa anlaması biraz güç bir konu. Ben de bu konuyu kendi anladığım ve sizin de anlayacağ&#...

Hatice Varlık |

11.08.2014

Merhaba!

Bu yazımda size C# ile eşzamansız programlama (asynchronous programming) ve eşzamansız programlamada kontrol akışının (control flow) nasıl sağlandığından bahsedeceğim. Bana kalırsa anlaması biraz güç bir konu. Ben de bu konuyu kendi anladığım ve sizin de anlayacağınızı düşündüğüm bir şekilde izah etmeye çalışacağım.

Eğer yazımda bir hata görürseniz, lütfen yorumunuzda belirtmekten kaçınmayın. Haydi, o zaman başlayalım!

 

Eşzamansız programlama nedir?

Hepimizin başına defalarca gelen bir olay vardır. Kullandığımız programda bir düğmeye basarsınız ve program aniden donar. Kullanıcı arayüzü (User Interface - UI) yaptığımız hiçbir işleme cevap vermez. Bir süre sonra program hiçbir şey olmamış gibi çalışmaya devam eder. Bunun sebebi arkaplanda yürütülen işleminin eşzamanlı (senkron) bir şekilde gerçekleştiriliyor olmasıdır yani program o anki işlemi tamamlamadan ne başka bir işleme devam edebilir ne de kullanıcının komutlarına cevap verebilir. Eşzamansız programlama burada işimize yarar. Aşağıdaki kod örneğini inceleyelim.

[code]private void button1_Click(object sender, EventArgs e)
{
    DownloadImage();
    textBox1.Text = "Resim indirildi.";
}

private void DownloadImage()
{
     WebClient client = new WebClient();
     byte[] imageData = client.DownloadData("http://haticevarlik.azurewebsites.net/images/yaz-okuluna-dogru/SAM_0361.JPG");
     this.pictureBox1.Image = Image.FromStream(new MemoryStream(imageData));
}[/code]

Bir Windows Form uygulaması düşünün. Bu uygulamada üç tane kontrolümüz olsun: button1, textBox1 ve pictureBox1. button1'e tıkladığımızda DownloadImage metodu çağırılacak ve bir websitesinden resim indirilecek. Resim indirildikten sonra textBox1'e "Resim indirildi" yazdırılacak. Resmin de boyutu büyük. Bu uygulamayı yazıp çalıştırdığınızda göreceksiniz ki düğmeye bastığımız anda programda bir donma meydana geliyor ve ancak resim indirme işlemi bittikten sonra program çalışır hale gelip textBox1'ın metni değiştiriliyor. İşte bu örneğimiz eşzamalı programlamaya bir örnektir. Herhangi bir işlem bitmeden bir sonraki işleme geçilemez ve UI kilitlenir. Şimdi bir de aşağıdaki kod örneğini inceleyelim.

[code]private void button1_Click(object sender, EventArgs e)
{
    DownloadImage();
    textBox1.Text = "Resim indiriliyor.";
}

private async void DownloadImage()
{
    WebClient client = new WebClient();
    byte[] imageData = await client.DownloadDataTaskAsync("http://haticevarlik.azurewebsites.net/images/yaz-okuluna-dogru/SAM_0361.JPG");
    this.pictureBox1.Image = Image.FromStream(new MemoryStream(imageData));
    textBox1.Text = "Resim indirildi.";
}[/code]

Yukarıdaki kod örneğini çalıştırdığınızda göreceksiniz ki, program resmin indirilmesini beklemeden yani DownloadImage metodu tamamlanmadan textBox1'ın metnini "Resim indiriliyor" olarak değiştiriyor ve siz de bu esnada arayüzde hiçbir takılmaya ya da kilitlenmeye sebep olmadan programda istediğiniz yere tıklayıp pencereyi başka yerlere taşıyabiliyorsunuz. Resim indirme işlemi tamamlandığında ise tekrar DownloadImage metoduna dönülüyor ve kalan işlemler (pictureBox1'a resim koyma ve textBox1'ın metnini "Resim İndirildi." olarak değiştirme) tamamlanıyor. Tüm bunları eşzamansız programlama sayesinde gerçekleştirdik.

Bir uygulamada eşzamansız metodları kullandığınız zaman o uygulama kullanıcı arayüzüne ve arayüzde yapılan değişikliklere tepki vermeye devam eder. İsterseniz bir pencerenin boyutunu büyütüp küçültebilir, pencereyi başka yere taşıyabilir ya da eşzamansız bir şekilde yürütülen işlemin bitmesini beklemeden uygulamayı kapatabilirsiniz. Şimdi dilerseniz bunun nasıl yapıldığına bakalım.

 

İki anahtar kelime: async ve await

Yukarıdaki iki ayrı programı inceleyelim. İkisinin de işlevi aynı fakat ikinci program, resmi eşzamansız bir şekilde indiriyor. Bunu async/await anahtar kelimelerini (keyword) ve DownloadData metodu yerine DownloadDataTaskAsync metodunu kullanarak gerçekleştiriyor. async ve await anahtar kelimeleri eşzamansız programlamanın merkezindedir. Bu kelimeleri kullanarak bir metodu eşzamansız hale getirebilirsiniz. Şimdi eşzamansız programlamada kontrol akışının nasıl sağlandığına bakalım.

 

Eşzamansız programlamada kontrol akışı

Eşzamansız programlamayı kullanarak resim indirdiğimiz program üzerinden kontrol akışının nasıl olduğuna maddeler halinde bakalım:

  • button1'a tıklandığında button1_click metoduna giriliyor ve DownloadImage metodu çağrılıyor. Kontrol button1_click'den DownloadImage metoduna geçiyor. async anahtar kelimesi derleyiciye metodun await anahtarını içerdiğini haber veriyor, client isminde bir WebClient nesnesi (object) oluşturuluyor.
  • Parametre olarak girilen kaynaktan resim indirme işlemi başlatılıyor. Fakat bu satırda await kullanıldığı için DownloadImage metodu askıya alınıyor(suspend) ve kontrol tekrar "caller" metodumuz olan olan button1_click metoduna dönüyor. textBox1'in text'i "Resim İndiriliyor." olarak değiştiriliyor. Devamında başka kodlar olmadığı için resim indirme işlemi bitene kadar kontrol bu metodda kalıyor.
  • Resim indirme işlemi tamamlandığında kontrol tekrar DownloadImage metoduna dönüyor ve metod kaldığı yerden çalışmaya devam ediyor. pictureBox1 kontrolüne resim ekleniyor ve textBox1'ın text'i "Resim İndirildi." olarak değiştiriliyor. Böylelikle her iki metoddaki kodların tamamı çalıştırılmış oluyor.

 

Sonuç

Eşzamansız (Asenkron) metodlar kullanmak iyi bir kullanıcı deneyimi oluşturmak için artık olmazsa olmazlardan. C# 5.0 ile gelen async ve await anahtarları eşzamansız metodda yazmayı epey kolaylaştırıyor. Elbette eşzamansız programlama bu kadarla sınırlı değil, yazılacak daha fazla detay var. Bu yazımda size basit bir şekilde eşzamansız programlamanın ardındaki fikri açıklamaya çalıştım. İnşallah faydalı olmuşumdur.

Kolay gelsin!

Hatice Varlık |

11.08.2014

Yorumlar

Faruk Demir
04.02.2017 - 12:38

Harika bir anlatım olmuş..

Metin Gülerce
24.08.2014 - 06:26

Konunuz çok güzel ellerinize sağlık.

Buna benzer konular açabilmek - yazar olmak için neler yapmamız gerek ?

Hatice Varlık
24.08.2014 - 07:06

Yorumunuz için teşekkür ederim Metin Bey. Ben Geleceği Yazanlar'ın ilk mezunlarındanım. Bu sayede yazılarım burada yayınlanıyor. Bildiğim kadarıyla da üyelerin yazar olması gibi bir durum yok.

Metin Gülerce
24.08.2014 - 07:14

Teşekkürler.