Jump to content

Asenkron Programlama (vb.net & C#.net)


wmismail

Recommended Posts

Asenkron Programlama’ya girmeden once bilinmesi gereken bir takim bilgileri sizlere aktarmak istiyorum. Çok çok önceki isletim sistemleri bir işlemi tamamlamadan diger işleme geçemezlerdi. Buna örnek olarak DOS isletim sistemini verebiliriz. Eger DOS tabanli bir program yazdiysaniz bilirsiniz… Ancak dönemimizin isletim sistemleri Asenkron olarak çalisabilmektedirler. Yani ayni anda birden fazla işlemi tamamlayabilmektedirler. Aslina bakarsaniz 1/0’dan baska birseyi anlamayan sistemin ayni anda birden fazla işlemi yapmasi; akillica planlanmis bir algoritmadan ibarettir. Visual Studio’nuzda haril haril kod yazarken bir yandan MSN’inizin çalismasi ve Winamp’inizda güldür güldür MP3’ünüzün çalmasi yaklasik 20 milisaniyelik zaman araliklari içerisinde işlemlerin sirayla gerçeklestirilmesinden ibarettir. Bunu açgözlü birinin önündeki yemekten, çorbadan ve tatlidan ardi ardina birer kasik almasi olayina benzetebilirsiniz J. Günümüzün isletim sistemleri ayni anda yapilmak istenen işlemleri ayri Thread’lerde gerçeklestirmektedir. Peki Thread nedir?

Thread ve MultiThread Nedir ?Thread, kelime anlami ve bilgisayar terimleri terminolojisine göre “alt işlem” anlamina gelir. Yani daha açik bir ifadeyle, thread; bir programin bagimsiz olarak CPU üzerinde islenebilen bir parçasidir. Ayrica, bir program, bir çok thread’in birlesmesinden meydana gelebilir ve iste bu da MultiThreadingtir. Fakat unutulmamalidir ki; bir programin illa Multithread bir uygulama olmasi sart degildir. Fakat birazdan ele alacagimiz faydalar, gelistiriciyi Multithread yapisini kullanmaya yönlendirebilir. Simdi Thread kavramini bir örnekle irdeleyelim. Thread’lar bir sirketteki çalisanlara benzerler. Tipik bir sirkette, bütün personeller ayni anda çalisabilir. Bu sirket, çalisan tüm threadleri içeren ve onlari ortak bir amaca yönelten ISLEMCI’dir. Normal bir uygulama yazip çalistirdiginizda, tek thread ile çalisan bir işlem baslatmis olursunuz. Böylece uygulamaniz, birim zamanda yalnizca bir işlem yapabilir (tek çalisanli bir sirket gibi). Degiskenleriniz ve nesneleriniz (object), Ofisteki faks ve fotokopi makinelerine benzer.. Bazilari globaldir ve sirkette çalisan herkes, bu cihazlari kullanabilir, bazilari ise yalnizca bir kisiye ya da bir departmana aittir, yani özeldir. Modern bir Isletim Sistemi ayni anda birçok programi çalistirmaniza izin verir, bu her bir programin bir ya da daha fazla thread’a bölünmesi ile mümkündür. Eger makinenizde bir işlemci varsa, birden fazla işlemin tamamen ayni anda çalismasi mümkün degildir. Tipik olarak isletim sistemi; ilk işlemin, saniyenin çok küçük bir kesiminde (yaklasik 20 milisaniyedir ve quanta sayisi olarak adlandirilir), CPU’da çalismasina izin verir, sonra bir diger işleme geçerek onu da 20ms’lik quanta süresince CPU’da çalistirir. Böylece bir anlamda bir iluzyon yaratilarak birçok seyin ayni anda çalistirildigi “izlenimi” verilir. Ayni zamanda belirli işlemciler ve çok işlemcili makineler, Win2k ve WinXP gibi isletim sistemleri ile iki işlemi ya da iki thread’i tamamen ayni anda çalistirabilmek mümkündür. (Kaynak: Türkay Ürkmez, www.yazilimuzmani.com, VB.Net ile Asenkron Programlama, Makale) Olay kisaca söyle gerçeklesmektedir. Main Thread (Windows Form) de yapilmasi istenen bir işlem, baska bir Thread’de gerçeklestirilir ve işlem tamamlandiktan sonra sonuç Main Thread’de gönderilir.

1000000885_image001.jpg

Her zaman dedigim gibi: konunun anlasilirligi açisindan makaleye bir örnek ile devam etmekte fayda var. Bu makalemde hem C#’cilar, hem de VB’ciler için her iki dilin kodlarinida sunacagim. Hemen formumuza bir Timer ve bir Button yerlestirelim. Timer’in Enabled property’sini True, Invertal property’sini ise 1000 yapalim:

1000000885_image002.jpg

Projemizdeki senaryo kisaca söyle: Form’umuz açildiginda Timer’imiz Enabled property’si True oldugundan dolayi çalismaya baslayacak ve Invertal property’si 1000 oldugundan dolayi her 1 sn.’de Tick ani yakalandiginda yazacagimiz kod sayesinde Button’umuzun BackColor’ini degistirecek. Button’a bastigimizda ise uygulamamiz 0’dan 1.000.000.000’a kadar sayacak. Simdi kod tarafina geçerek uygulamamiza bir method ekleyelim.

C#.Net 1000000885_image003.jpg

VB.Net 1000000885_image004.jpg

Simdi ise Desing tarafindan Timer’in üzerine çift tiklayarak açilan method içine Button’umuzun BackColor’ini degistirecek kodlari yazalim:

C#.Net 1000000885_image005.jpg

VB.Net 1000000885_image006.jpg

Son olarak Button’umuzun Click aninda da Say() methodunu çagirarak projemizi çalistiralim:

C#.Net 1000000885_image007.jpg

VB.Net 1000000885_image008.jpg

Görüldügü üzere; uygulamamiz sayma işlemine basladiginda Button’umuz renk degistiremiyor. Bunun sebebi sayma işlemi ile renk degistirme işleminin ayni Thread (Main Thread) üzerinde gerçeklestirilmesi. Simdi uygulamamizi Asenkron olarak kodlayalim: Bunun için ilk once Local’e işlemimizle ilgili argümanlari tasiyacak delegemizi tanimlamamiz ve Form’un Load aninda Asenkron çalistiracagi methodu vererek bir instance’ini olusturmamiz gerekmektedir:

C#.Net 1000000885_image009.jpg

VB.Net 1000000885_image010.jpg

Simdi ise Button’umuzun Click aninda Say methodunu direk çagirmak yerine delegemizin BeginInvoke methodu ile Say methodunu Asenkron olarak çalistirmaliyiz. Ancak bu işlemden once Asenkron işlem bittiginde yapilmasi gereken kodlari yazabilecegimiz CallBack methodunu olusturmaliyiz. Say methodumuzdaki MessageBox.Show komutumuzu CallBack methodumuza tasiyalim. Birde Show amaciyla Form’umuzun Text’ine işlem baslarken “Sayiyor…”, bittiginde ise “Saydi.” yazdiralim:

C#.Net 1000000885_image011.jpg

VB.Net 1000000885_image012.jpg

SayBitti() methodunda; IsCompleted = True ile işlemin tamamlanip tamamlanmadigini control ediyoruz. Sonuç True ise, yani tamamlandiysa Thread’I sonlandirip kullaniciyi bilgilendiriyoruz. Artik Button’umuzun Click aninda Delegate’imizin BeginInvoke methodu ile işlemimizi asenkron olarak çalistirabiliriz. Ancak kodumuzu yazmadan once BeginInvoke methodunun istedigi iki değerden bahsedelim: Bunardan ilki olan AsyncCallBack methodu istemektedir. Biz ise yukarda SayBitti adinda bir CallBack methodu hazirladik. Ikincisi ise işleminiz sirasinda yaninizda tasiyacaginiz ve CallBack methodunda Result.AsyncState komutu ile alabileceginiz bir nesne istemektedir. Eger böyle bir nesneniz varsa buraya verebilirsiniz. Yoksa nothing (VB için), null (C# için) verebilirsiniz. Simdi Button’umuzun Click aninda Delegate’imizin BeginInvoke methodu ile işlemimizi asenkron olarak çalistiralim:

C#.Net 1000000885_image013.jpg

VB.Net 1000000885_image014.jpg

Artik projemizi çalistirabiliriz:

1000000885_image015.jpg

1000000885_image016.jpg

MesajBox’imiza tikladiktan sonra Formumuzun Text property’sine “Saydi.” yazdirirken bir hata aldik ! Hatada; Form1 kontrolüne işlemimizin tamamlandigi Thread’den ulasamadigini söylüyor. Evet system son derece hakli. Formumuz Main Thread’de oldugundan baska bir Thread’de tamamlandiginda bulamayacagi formun Text property’sini degistirmeye kalktik. Peki simdi projemizde show yapamayacakmiyiz? Formun Text property’sini degistirmek o kadar önemli olmayabilir. Ancak baska bir Thread’e yaptirdiginiz bir işlemin sonucunu kullaniciya göstermek zorunda olabilirsiniz. işte burada formun BeginInvoke methodu imdadimiza yetisiyor. Formun BeginInvoke methoduna parameter olarak, argüman olarak bir method alan MethodInvoker delegesini vererek; Main Thread içinde bulunan bir nesneye müdahale edebiliriz. Ancak burada dikkat edilmesi gereken husus; MethodInvoker’a verecegimiz methodun hiçbir parameter almamasi gerekmektedir. Bunun içinde en iyi çözüm Main Thread’deki controle verecegimiz işlem sonucunu localde tanimli bir degiskene atamak ve method’da controlün değerini bu degiskenden vermektir. Simdi Formumuzun Text property’sini degistirebilecegimiz parametresiz bir method tanimlayalim:

C#.Net 1000000885_image017.jpg

VB.Net 1000000885_image018.jpg

Son olarak CallBack methodunda Formun BeginInvoke methodunu çalistirarak uygulamamizi baslatabiliriz:

C#.Net 1000000885_image019.jpg

VB.Net 1000000885_image020.jpg

Artik projemizi çalistirabiliriz:

1000000885_image021.jpg

Bir baska makalede görüşmek üzere…

Link to comment
Share on other sites

Archived

This topic is now archived and is closed to further replies.

  • Recently Browsing   0 members

    No registered users viewing this page.

×
×
  • Create New...