![]() |
| |||||||
| .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: asenkron, cnet, programlama, vbnet |
![]() |
| | LinkBack | Seçenekler | Stil |
| |
| | #1 (permalink) |
| Mendoza | 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... |
| | |
| |
| | #2 (permalink) |
| Yeni Üye Üyelik tarihi: Feb 2008 Yaş: 23
Mesajlar: 5
Rep Gücü: 0 ![]() | 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. |
| | |
| | #3 (permalink) |
| Yeni Üye Üyelik tarihi: Mar 2008 Yaş: 27
Mesajlar: 3
Rep Gücü: 0 ![]() | 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... |
| | |
![]() |
| 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 | |
| |