[C#]Senkron ve Asenkron Programlama

Kategori Genel
04.05.2017
3024 Okunma

Esen,
Uzun zamandır yazmak istediğim bir örnek olarak bu asenkron programlamayı kafamda planlıyordum. Bugüne nasipmiş. Hazırladığımız programlarda -eğer büyük boyutlu dosyalarla işlemlerle çalışmıyorsak- genellikle göz ardı ettiğimiz bir konudur: Asenkron programlama. Bir işlemi yaptırırken bir başka işlemi makinenize yaptıramıyorsanız işte bu senkron programlamaya bir örnektir. Uygulamanız büyük boyutlu bir dosya indiriyor olsun, eğer senkron bir şekilde indiriyorsa o zaman uygulamanız donar ve başka işlem yapamaz hatta bazen -yanıt vermiyor- hatası gelir. Eğer uygulamanıza akıllılık eder de dokunmazsanız program da sorunsuz bir şekilde işini bitirir ve kaldığınız yerden devam edersiniz.
Ancak asenkron(eş zamansız) programlama da işler biraz daha güzel. Asenkron olarak tanımladığımız her şey o iş bitene kadar çalışmaya devam eder ancak programımız donmaz başka işlemler yapmaya devam edebiliriz. Şimdi bunu örnekler ile açıklayalım:
Ad alanları önemli:

using System.Net;                //WebClient için
using System.IO;                 //MemoryStream için

İki buton, iki textbox, iki picturebox işimizi görecek;

        private void btnSenkron_Click(object sender, EventArgs e)
        {
            SenkronIndir();
            txtSenkron.Text = "İndirme başarılı";

        }

        private void SenkronIndir()
        {
            WebClient indirmeIstemcisi = new WebClient();
            byte[] resimVerisi = indirmeIstemcisi.DownloadData("https://www.sctzine.com/wp-content/uploads/cheatsheet19201200.png");
            pictSenkron.Image = Image.FromStream(new MemoryStream(resimVerisi));
        }

SenkronIndir adında parametre almayan ve bir şey geri döndürmeyen bir fonksiyon yazdım. Herhangi bir ekstra tanımlama yok. Bu fonksiyon “WebClient” sınıfı altındaki “DownloadData” yordamını kullanarak bir resim indirecek. Bu bir şişman iso dosyası da olabilirdi ;) Bu fonksiyonu asenkron – eşzamansız olarak tanımlamadığımız için dosya indirilirken herşey duracak indirme bitene kadar programımız donacak. Hatta çok büyükse dosya belki hata verecek.
Oysa iki komut ile bu durumu değiştirebiliriz:

        private void btnAsenkron_Click(object sender, EventArgs e)
        {
            AsenkronIndir();                                //fonksiyonu çağıaracak
            txtAsenkron.Text = "İndiriliyor.............";  //fonksiyon çağrıldı bitti ama indirme devam edecek
                                                            //o yüzden bu komutu çağıracak
        }

          //async ve await tanımlamaları ile fonksiyonumuzu asenkron yaptık.
        private async void AsenkronIndir()
        {
            WebClient aIndirmeIstemcisi = new WebClient();
            byte[] aResimVerisi = await aIndirmeIstemcisi.DownloadDataTaskAsync("https://www.sctzine.com/wp-content/uploads/cheatsheet19201200.png");
            pictAsenkron.Image = Image.FromStream(new MemoryStream(aResimVerisi));
            txtAsenkron.Text = "İndirme Başarılı";          //indirme bittiğinde ise bu satır çalışacak

“async” komutu ile “AsenkronIndir” fonksiyonumuzun asenkron çalışacak bir fonksiyon olduğunu tanımladık. Fonksiyon içerisindeki “await” komutu ile “aIndirmeIstemcisi” nesnesinin “DownloadDataTaskAsync” yordamıyla asenkron bir şekilde indirme yapacağını tanımladık. “await”i yazmasaydık hata verecekti.
Örnek uygulamanın kaynak kodlarını aşağıdan indirebilirsiniz:
[dm]144[/dm]

Comments of this post

Henüz yorum bulunmuyor!