ASENKRON Programlama Giriş

2 yorum
Merhabalar Arkadaşlar, İlk yazımı sizlerle paylaşmanın heyecanı içerisindeyim. Açıkçası ilk yazımı hangi konuda yazmam gerektiği konusunda bir hayli düşündüm.Çünkü hem yararlı olması hem de anlatamsı kolay konu olması gerekmekteydi.Sonuç olarak c# programa dillerinin bence en büyük nimetlerinden birisi olan asenkron programanın c# 5.0 ile hayatımıza katılan ve senkron metodlarımızı asenkron hale getirmekte bizlere çok çok kolaylık sağlayan asnyc ve await keywordleri üzerinde durmaya ve konunun mantığını anlamaya yardımcı olacak çok temel bir örnek yazmakta karar kıldım.Umarım yararlı olur.  Öncelikle senkron ve asenkron programlama üzerinde duralım. Bilindiği gibi bir kod bloğu içerisinde metodlar yukarıdan aşağıya bir görev sırasında işlemleri gerçekleştirmektedir.Yukarıdaki metod işlemde iken aşağıdaki metoda geçilmez ve beklenir.Bu akış şekline senkron programlama denir.Bu programlama tekniğinin kavranışı ve takibi kolay olmasına rağmen örneğin uzun süren(input output gibi fiziki disk işlemleri,veritabanından büyük miktarda veri çekilmesi vb) işlemlerde kullanıcı arayüzümüz kilitlenir ve cevap veremez duruma gelmektedir.Bu soruna karşı Microsoft ‘un çözümü ise asenkron programlama.Asenkron programada ise bir kod parçası işlenirken aynı zamanda başka bir kod parçası da işlenebilir bu sayede kullanıcı programın bir parçasında işlem yaparken başka bir bölümünde de işlem yapabilir. Bu kadar ufak bir bilgi yeterli olduktan sonra örneğimize geçebiliriz. Örneğimizi bir Windows application olarak geliştiriyor olacağız.Bu örneğimizde farkı görebilmeniz için aynı kodları senkron ve asenkron çalıştırılması arasındaki farkları görebilmeniz için iki adet buton olacak.Aynı kodları bu butonlar aracılığı ile hem senkron hem async ve await keywordleri yardımıyla asenkron yürüteceğiz.Dizaynımız resimdeki gibi.



SENKRON KODLAR





Hello metodunun içeriğinde programı çalıştıran threadi 5 saniyeliğine durdurarak program arayüzünün 5 saniyeliğine kullanılamaz olmasını sağladık.Programı çalıştırıp senkron çalış butonuna basıldığında formu oynatmaya çalıştığımızda 5 saniyeliğine oynatamadığımızı,programın cevap vermediğini göreceksiniz

ASENKRON KODLAR




HelloAsync() metodunda yaptıklarımız, yeni bir task tipi oluşturup bu taskın içerisinde Hello() metodunu çağırmak.Planladığımız Hello() metodundaki arayüzü kullanılamaz hale getiren thread bekletme işlemini farklı bir task tipi içerisinde yaptığımız için kullanılıcı arayüzü kullanıcının bu 5 saniyelik süre içerisinde de kullanılabilir olmasını sağlamak.btnAsenron butonunun click eventinde gördüğümüz async anahtar kelimesi bu metodun içerisinde asenkron bir işlemin yapılacağı, metodun içerisindeki await anahtar kelimesi ile de bu keywordden sonra gelen metodun asenkron çağrılacağını CLR a bildirmektir.Programı çalıştırıp asenkron çalış butonuna bastığımızda ise programı çalıştıran threadimiz 5 saniyeliğine bekletilse dahi kullanıcı arayüzü farklı bir task tipi içerisinde işlem gördüğü için formu oynatmaya çalıştığımızda oynatabildiğimizi yani aslında arkada thread uyusa dahi programın bize cevap verdiğini göreceğiz. Sonuç olarak, asenkron programlama Windows application ve Windows phone uygulamaları için hayati önem taşımaktadır.Bu makalemizde üzerinde durmamamıza rağmen bir metodun asenkron olarak çalıştırılabilmesi için Task tipinden bir değer döndürmesi gerekmektedir.Task tipini arayı soğutmadan ele alırız.Okuduğunuz için çok teşekkür eder her türlü sorunuzu mailim üzerinden yollayabileceğiniz gibi yorumlara da yazabileceğinizi belirtmek isterim.Umarım verimli olmuştur.İyi kodlamalar


Uygulama Source :

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;
 
namespace AsyncAwaitBlog
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
 
        private void btnSenkron_Click(object sender, EventArgs e)
        {
            Hello();
        }
 
        private void Hello()
        {
            Thread.Sleep(5000);//Threadi 5 saniye uyutarak programın çalışmasını durdurduk.
            MessageBox.Show("Merhaba!");
        }
 
        private Task HelloAsync()
        {
            return Task.Factory.StartNew(() =>
            {
                Hello();
            });
        }
 
        private async void btnAsenkron_Click(object sender, EventArgs e)
        {
          await HelloAsync();
        }
 
        private void Form1_Load(object sender, EventArgs e)
        {
 
        }
        
    }
}


Proje indir Mert Turan

2 yorum :

Soru Görüş önerileriniz için gmail plus üzerinden + layın müsait olduğumda mutlaka yanıt dönüyor olacağım.