UltraVB.Com | vBulletin Destek ve Geliştirme Forumu  

Geri git   UltraVB.Com | vBulletin Destek ve Geliştirme Forumu > Programlama > Yazılım > .Net Framework

.Net Framework Visual Studio.Net Temelini oluşturan .Net Framework hakkındaki akıllarda bulunan soruların cevapları bulabileceginiz önemli bir Türkçe kaynaktır. • NET Framework kütüphanesi • Common Language Runtime • Program örnekleri • Visual Studio .Net Patformu ve geleceği hakkında konular, makaleler, örnek kodlar

Tags: , , ,

Cevapla
 
LinkBack Seçenekler Stil

Alt 02-06-2007   #1 (permalink)
Mendoza
 
SaidX - ait Kullanıcı Resmi (Avatar)
 
Üyelik tarihi: Dec 2006
Nerden: Linux
Mesajlar: 474
Rep Gücü: 0
SaidX is an unknown quantity at this point
SaidX - MSN üzeri Mesaj gönder
Asenkron Programlama (VB.Net & C#.Net)

Asenkron Programlama’ya girmeden once bilinmesi gereken bir takım bilgileri sizlere aktarmak istiyorum.

Çok çok önceki işletim sistemleri bir işlemi tamamlamadan diğer işleme geçemezlerdi. Buna örnek olarak DOS işletim sistemini verebiliriz. Eğer DOS tabanlı bir program yazdıysanız bilirsiniz… Ancak dönemimizin işletim sistemleri Asenkron olarak çalışabilmektedirler. Yani aynı anda birden fazla işlemi tamamlayabilmektedirler. Aslına bakarsanız 1/0’dan başka birşeyi anlamayan sistemin aynı anda birden fazla işlemi yapması; akıllıca planlanmış bir algoritmadan ibarettir.

Visual Studio’nuzda harıl harıl kod yazarken bir yandan MSN’inizin çalışması ve Winamp’ınızda güldür güldür MP3’ünüzün çalması yaklaşık 20 milisaniyelik zaman aralıkları içerisinde işlemlerin sırayla gerçekleştirilmesinden ibarettir. Bunu açgözlü birinin önündeki yemekten, çorbadan ve tatlıdan ardı ardına birer kaşık alması olayına benzetebilirsiniz J.

Günümüzün işletim sistemleri aynı anda yapılmak istenen işlemleri ayrı Thread’lerde gerçekleştirmektedir. Peki Thread nedir? Theard’in açıklamasını Türkay Ürkmez hocamın VB.Net ile Asenkron Programlama makalesinden bir bölümü alarak sizlere sunmak istiyorum:


Thread ve MultiThread Nedir ?

Thread, kelime anlamı ve bilgisayar terimleri terminolojisine göre “alt işlem” anlamına gelir. Yani daha açık bir ifadeyle, thread; bir programın bağımsız olarak CPU üzerinde işlenebilen bir parçasıdır. Ayrıca, bir program, bir çok thread’in birleşmesinden meydana gelebilir ve işte bu da MultiThreadingtir. Fakat unutulmamalıdır ki; bir programın illa Multithread bir uygulama olması şart değildir. Fakat birazdan ele alacağımız faydalar, geliştiriciyi Multithread yapısını kullanmaya yönlendirebilir.

Şimdi Thread kavramını bir örnekle irdeleyelim.

Thread’lar bir şirketteki çalışanlara benzerler. Tipik bir şirkette, bütün personeller aynı anda çalışabilir. Bu şirket, çalışan tüm threadleri içeren ve onları ortak bir amaca yönelten İŞLEMCİ’dir. Normal bir uygulama yazıp çalıştırdığınızda, tek thread ile çalışan bir işlem başlatmış olursunuz. Böylece uygulamanız, birim zamanda yalnızca bir işlem yapabilir (tek çalışanlı bir şirket gibi). Değişkenleriniz ve nesneleriniz (object), Ofisteki faks ve fotokopi makinelerine benzer.. Bazıları globaldir ve şirkette çalışan herkes, bu cihazları kullanabilir, bazıları ise yalnızca bir kişiye ya da bir departmana aittir, yani özeldir.

Modern bir İşletim Sistemi aynı anda birçok programı çalıştırmanıza izin verir, bu her bir programın bir ya da daha fazla thread’a bölünmesi ile mümkündür. Eğer makinenizde bir işlemci varsa, birden fazla işlemin tamamen aynı anda çalışması mümkün değildir. Tipik olarak işletim sistemi; ilk işlemin, saniyenin çok küçük bir kesiminde (yaklaşık 20 milisaniyedir ve quanta sayısı olarak adlandırılır), CPU’da çalışmasına izin verir, sonra bir diğer işleme geçerek onu da 20ms’lik quanta süresince CPU’da çalıştırır. Böylece bir anlamda bir iluzyon yaratılarak birçok şeyin aynı anda çalıştırıldığı “izlenimi” verilir.

Aynı zamanda belirli işlemciler ve çok işlemcili makineler, Win2k ve WinXP gibi işletim sistemleri ile iki işlemi ya da iki thread’ı tamamen aynı anda çalıştırabilmek mümkündür.

(Kaynak: Türkay Ürkmez, www.yazilimuzmani.com, VB.Net ile Asenkron Programlama, Makale)


Olay kısaca şöyle gerçekleşmektedir. Main Thread (Windows Form) de yapılması istenen bir işlem, başka bir Thread’de gerçekleştirilir ve işlem tamamlandıktan sonra sonuç Main Thread’de gönderilir.



Her zaman dediğim gibi: konunun anlaşılırlığı açısından makaleye bir örnek ile devam etmekte fayda var.

Bu makalemde hem C#’cılar, hem de VB’ciler için her iki dilin kodlarınıda sunacağım.

Hemen formumuza bir Timer ve bir Button yerleştirelim. Timer’ın Enabled property’sini True, Invertal property’sini ise 1000 yapalım:



Projemizdeki senaryo kısaca şöyle:

Form’umuz açıldığında Timer’ımız Enabled property’si True olduğundan dolayı çalışmaya başlayacak ve Invertal property’si 1000 olduğundan dolayı her 1 sn.’de Tick anı yakalandığında yazacağımız kod sayesinde Button’umuzun BackColor’ını değiştirecek. Button’a bastığımızda ise uygulamamız 0’dan 1.000.000.000’a kadar sayacak.

Şimdi kod tarafına geçerek uygulamamıza bir method ekleyelim.

C#.Net


VB.Net


Şimdi ise Desing tarafından Timer’ın üzerine çift tıklayarak açılan method içine Button’umuzun BackColor’ını değiştirecek kodları yazalım:

C#.Net


VB.Net


Son olarak Button’umuzun Click anında da Say() methodunu çağırarak projemizi çalıştıralım:

C#.Net


VB.Net


Görüldüğü üzere; uygulamamız sayma işlemine başladığında Button’umuz renk değiştiremiyor. Bunun sebebi sayma işlemi ile renk değiştirme işleminin aynı Thread (Main Thread) üzerinde gerçekleştirilmesi.

Şimdi uygulamamızı Asenkron olarak kodlayalım:

Bunun için ilk once Local’e işlemimizle ilgili argümanları taşıyacak delegemizi tanımlamamız ve Form’un Load anında Asenkron çalıştıracağı methodu vererek bir instance’ını oluşturmamız gerekmektedir:

C#.Net


VB.Net


Şimdi ise Button’umuzun Click anında Say methodunu direk çağırmak yerine delegemizin BeginInvoke methodu ile Say methodunu Asenkron olarak çalıştırmalıyız. Ancak bu işlemden once Asenkron işlem bittiğinde yapılması gereken kodları yazabileceğimiz CallBack methodunu oluşturmalıyız. Say methodumuzdaki MessageBox.Show komutumuzu CallBack methodumuza taşıyalım. Birde Show amacıyla Form’umuzun Text’ine işlem başlarken “Sayıyor…”, bittiğinde ise “Saydı.” yazdıralım:

C#.Net


VB.Net


SayBitti() methodunda; IsCompleted = True ile işlemin tamamlanıp tamamlanmadığını control ediyoruz. Sonuç True ise, yani tamamlandıysa Thread’I sonlandırıp kullanıcıyı bilgilendiriyoruz.

Artık Button’umuzun Click anında Delegate’imizin BeginInvoke methodu ile işlemimizi asenkron olarak çalıştırabiliriz. Ancak kodumuzu yazmadan once BeginInvoke methodunun istediği iki değerden bahsedelim:

Bunardan ilki olan AsyncCallBack methodu istemektedir. Biz ise yukarda SayBitti adında bir CallBack methodu hazırladık. İkincisi ise işleminiz sırasında yanınızda taşıyacağınız ve CallBack methodunda Result.AsyncState komutu ile alabileceğiniz bir nesne istemektedir. Eğer böyle bir nesneniz varsa buraya verebilirsiniz. Yoksa nothing (VB için), null (C# için) verebilirsiniz.

Şimdi Button’umuzun Click anında Delegate’imizin BeginInvoke methodu ile işlemimizi asenkron olarak çalıştıralım:

C#.Net


VB.Net


Artık projemizi çalıştırabiliriz:





MesajBox’ımıza tıkladıktan sonra Formumuzun Text property’sine “Saydı.” yazdırırken bir hata aldık ! Hatada; Form1 kontrolüne işlemimizin tamamlandığı Thread’den ulaşamadığını söylüyor. Evet system son derece haklı. Formumuz Main Thread’de olduğundan başka bir Thread’de tamamlandığında bulamayacağı formun Text property’sini değiştirmeye kalktık. Peki şimdi projemizde show yapamayacakmıyız? Formun Text property’sini değiştirmek o kadar önemli olmayabilir. Ancak başka bir Thread’e yaptırdığınız bir işlemin sonucunu kullanıcıya göstermek zorunda olabilirsiniz.

İşte burada formun BeginInvoke methodu imdadımıza yetişiyor. 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 vereceğimiz methodun hiçbir parameter almaması gerekmektedir. Bunun içinde en iyi çözüm Main Thread’deki controle vereceğimiz işlem sonucunu localde tanımlı bir değişkene atamak ve method’da controlün değerini bu değişkenden vermektir.

Şimdi Formumuzun Text property’sini değiştirebileceğimiz parametresiz bir method tanımlayalım:

C#.Net


VB.Net


Son olarak CallBack methodunda Formun BeginInvoke methodunu çalıştırarak uygulamamızı başlatabiliriz:

C#.Net


VB.Net


Artık projemizi çalıştırabiliriz:

__________________
sevince...
SaidX isimli Üye şimdilik offline konumundadır  
Digg this Post!Add Post to del.icio.usBookmark Post in TechnoratiFurl this Post!
Alıntı ile Cevapla


Alt 02-07-2008   #2 (permalink)
Yeni Üye
 
Üyelik tarihi: Feb 2008
Yaş: 23
Mesajlar: 5
Rep Gücü: 0
tugaygalip is on a distinguished road
emeğinize sağlık gerçekten güzel olmuş
hatta buraya bir buton daha ekledim ve sayma işlemi dewam ederken o buton da ayrıca çalıştı
yani thread çalıştı .
bana biraz da sql de yardımcı olursanız sevinirim.
kolay gelsin.
tugaygalip isimli Üye şimdilik offline konumundadır  
Digg this Post!Add Post to del.icio.usBookmark Post in TechnoratiFurl this Post!
Alıntı ile Cevapla

Alt 03-14-2008   #3 (permalink)
Yeni Üye
 
Üyelik tarihi: Mar 2008
Yaş: 27
Mesajlar: 3
Rep Gücü: 0
serhatozturk is on a distinguished road
Makalemi benden habersiz çalıp kullandığın için teşekkür ederim. En azından benden izin isteseydin... Bu saygısızca hareketinin cevabını seni şikayet ederek vereceğim.

Makalenin bana ait olduğunu görmek isteyen arkadaşlar Yazılım Uzmanı.Com sitesine bakabilirler...
serhatozturk isimli Üye şimdilik offline konumundadır  
Digg this Post!Add Post to del.icio.usBookmark Post in TechnoratiFurl this Post!
Alıntı ile Cevapla
Cevapla

Anahtar Kelimeler
asenkron, c#net, programlama, vbnet


Thread Tags
methodinvoker nedir geri sayma c asenkron programlama vbnet de saati geri saydırma




Konuyu Toplam 1 Üye okuyor. (0 Kayıtlı üye ve 1 Misafir)
 
Seçenekler
Stil

Yetkileriniz
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is Açık
Smileler Açık
[IMG] Kodları Açık
HTML-KodlarıKapalı
Trackbacks are Açık
Pingbacks are Açık
Refbacks are Açık


Şu Anki Saat: 02:12


Powered by vBulletin® Version 3.7.4
Copyright ©2000 - 2009, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO 3.1.0
Beşiktaş Tezahüratları