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!
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.
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 programlamayı kullanarak resim indirdiğimiz program üzerinden kontrol akışının nasıl olduğuna maddeler halinde bakalım:
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!
Harika bir anlatım olmuş..
Konunuz çok güzel ellerinize sağlık.
Buna benzer konular açabilmek - yazar olmak için neler yapmamız gerek ?
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.
Teşekkürler.