﻿
{"id":285,"date":"2012-03-21T00:41:44","date_gmt":"2012-03-21T00:41:44","guid":{"rendered":"http:\/\/www.gencayyildiz.com\/blog\/?p=285"},"modified":"2012-05-28T12:59:22","modified_gmt":"2012-05-28T12:59:22","slug":"cta-asenkron-mimarisi","status":"publish","type":"post","link":"https:\/\/www.gencayyildiz.com\/blog\/cta-asenkron-mimarisi\/","title":{"rendered":"C# Asenkron Mimarisi"},"content":{"rendered":"<div id=\"fb-root\"><\/div>\n<p>Bu yaz\u0131mda C#&#8217;ta Asenkron mimarisini inceleyece\u011fiz.Bir program ak\u0131\u015f\u0131nda bir i\u015flem bitmeden ba\u015fka bir i\u015flem yap\u0131lmaz.Asenkron mimari bize, s\u00fcre\u00e7lerin birbirinden ba\u011f\u0131ms\u0131z ayn\u0131 anda \u00e7al\u0131\u015fmas\u0131n\u0131 sunuyor.C#&#8217;ta Asenkron mimarisini uygulamak i\u00e7in iki yap\u0131 mevcuttur.Bunlardan biri Asenkron Metodlar (BeginInvoke, Stream.BeginRead vb..) di\u011feri Thread S\u0131n\u0131f\u0131d\u0131r.Bu yaz\u0131mda sizlere Asenkron metodlar\u0131 g\u00f6sterece\u011fim.<br \/>\n<!--more-->\u00d6ncelikle mevzuyu daha derinlemesine a\u00e7\u0131klamak istiyorum.A\u015fa\u011f\u0131daki kodlar\u0131 inceleyiniz.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n            while (true)\r\n            {\r\n\r\n            }\r\n            MessageBox.Show(&quot;Test&quot;);\r\n<\/pre>\n<p>Yukar\u0131daki i\u015flem Senkron \u00e7al\u0131\u015ft\u0131\u011f\u0131 i\u00e7in sonsuz d\u00f6ng\u00fc bitmedi\u011fi taktirde &#8220;Test&#8221; mesaj\u0131n\u0131 g\u00f6rmemiz m\u00fcmk\u00fcn olmayacakt\u0131r.Sonsuz d\u00f6ng\u00fcy\u00fc ve &#8220;Text&#8221; mesaj\u0131n\u0131 Asenkron \u00e7al\u0131\u015ft\u0131rd\u0131\u011f\u0131m\u0131z taktirde ikiside ayn\u0131 anda \u00e7al\u0131\u015fabilir hale gelecektir.Yani birbirlerinden ba\u011f\u0131ms\u0131z \u00e7al\u0131\u015facaklard\u0131r.<br \/>\n<strong><em>De\u011fi\u015fik komut bloklar\u0131n\u0131 ayn\u0131 anda asenkron \u00e7al\u0131\u015ft\u0131rmak i\u00e7in delegelere ba\u015fvururuz.<\/em><\/strong><\/p>\n<hr \/>\n<p>\u015eimdi a\u015fa\u011f\u0131daki kodlar\u0131 inceleyiniz.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n        void X()\r\n        {\r\n            while (DateTime.Now.Second != 20)\r\n            {\r\n                this.Text = DateTime.Now.Second.ToString();\r\n            }\r\n        }\r\n        private void button1_Click(object sender, EventArgs e)\r\n        {\r\n            X();\r\n        }\r\n<\/pre>\n<p>buton1 isimli nesneye t\u0131klad\u0131\u011f\u0131m\u0131z zaman X metodu devreye girecektir.Formun Text&#8217;inde saniyeleri g\u00f6rece\u011fiz ama formu hareket ettiremeyece\u011fiz,kapatamayaca\u011f\u0131z ya da ba\u015fka bir i\u015flem yapamayaca\u011f\u0131z.\u00c7\u00fcnk\u00fc bu yap\u0131lmaya \u00e7al\u0131\u015f\u0131lan i\u015flemlerin hepsi(s\u00fcr\u00fckleme,kapatma vs),sonu\u00e7ta program\u0131m\u0131z\u0131n while d\u00f6ng\u00fcs\u00fc bitmeden ger\u00e7ekle\u015ftirilemeyecektir.Bunun sebebi yukar\u0131da X medotu i\u00e7indeki while d\u00f6ng\u00fcs\u00fc senkron \u00e7al\u0131\u015fmaktad\u0131r ve kendisinin \u00e7al\u0131\u015fmas\u0131 bitmeden,ba\u015fka i\u015fleme izin vermiyor.<br \/>\n\u015eimdi Asenkron mimariyi kullanma zaman\u0131.X metodunu asenkron olarak \u00e7al\u0131\u015ft\u0131ral\u0131m.<br \/>\nYukar\u0131daki kodlara bir + olarak delegate koduda ekleyip a\u015fa\u011f\u0131da yay\u0131nl\u0131yorum.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n        delegate void AsenkronHandler();\r\n        void X()\r\n        {\r\n            while (DateTime.Now.Second != 20)\r\n            {\r\n                this.Text = DateTime.Now.Second.ToString();\r\n            }\r\n        }\r\n        private void button1_Click(object sender, EventArgs e)\r\n        {\r\n            X();\r\n        }\r\n<\/pre>\n<p>\u015eimdi bu delegemizden bir nesne olu\u015fturup,X metodumuzu bu delegeye i\u015faret ettirelim.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n            AsenkronHandler asenkron = new AsenkronHandler(X);\r\n            asenkron(); \/\/B\u00f6yle \u00e7al\u0131\u015ft\u0131r\u0131rsam da senkron \u00e7al\u0131\u015f\u0131r.\r\n            asenkron.Invoke(); \/\/B\u00f6yle \u00e7al\u0131\u015ft\u0131r\u0131rsam da senkron \u00e7al\u0131\u015facakt\u0131r.\r\n<\/pre>\n<p>Yukar\u0131da g\u00f6rd\u00fc\u011f\u00fcn\u00fcz gibi bir tek delegeyle metodu \u00e7al\u0131\u015ft\u0131rmak Asenkron \u00e7al\u0131\u015ft\u0131rmaya yetmiyor.Peki ne yapmam\u0131z laz\u0131m.<br \/>\n<strong><em>AsenkronHandler ad\u0131nda delegate nesnesinin &#8220;Begin&#8221; ile ba\u015flayan metodlar\u0131, asenkron \u00e7al\u0131\u015ft\u0131rma yapabilmek i\u00e7indir.<\/em><\/strong><\/p>\n<p><em><strong>BeginInvoke() Metodu :<\/strong><\/em><br \/>\nBeginInvoke() metodu ile, delegemizin i\u015faret etti\u011fi metodu asenkron \u00e7al\u0131\u015ft\u0131rm\u0131\u015f oluyoruz.Burada BeginInvoke() metodu bizden AsyncCallback delegesi arac\u0131l\u0131\u011f\u0131yla \u00e7al\u0131\u015ft\u0131r\u0131lacak bir metod istiyor.Bunu istemesinin sebebi \u015fudur ;<br \/>\nDelegemizin \u00e7al\u0131\u015ft\u0131rd\u0131\u011f\u0131 metodun i\u015fi bitti\u011finde biz programc\u0131 olarak o i\u015fin bitti\u011finden haberdar olmak isteyebiliriz.Burada AsyncCallback delegesinin \u00e7al\u0131\u015ft\u0131raca\u011f\u0131 metod,delegemizin \u00e7al\u0131\u015ft\u0131raca\u011f\u0131 metodun i\u015fi bitti\u011fi zaman devreye girer(Otomatik olarak).<br \/>\nBeginInvoke() metodu bizden 2. olarak object bir de\u011fer ister.Bizim buna verece\u011fimiz de\u011fer AsyncCallback delegesinin \u00e7al\u0131\u015ft\u0131rd\u0131\u011f\u0131 metodun IAsyncResult tipinden tan\u0131mlanm\u0131\u015f parametresine g\u00f6nderilir.<\/p>\n<p>\u015eimdi yukar\u0131da anlatt\u0131klar\u0131m\u0131 kodlarda g\u00f6relim.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n       private void button1_Click(object sender, EventArgs e)\r\n        {\r\n            AsenkronHandler asenkron = new AsenkronHandler(X);\r\n            asenkron.BeginInvoke(new AsyncCallback(Y), this);\r\n\/*BeginInvoke metodu 1. parametresinde, AsyncCallback delegesinden, geriye d\u00f6n\u00fc\u015f\r\ntipi olmayan ve IAsyncResult tipinden parametre alan bir metod istiyor.\r\nIAsyncResult tipinden parametre alan Y() metodunu yaz\u0131p ben BeginInvoke\r\nmetodunun 1. parametresine g\u00f6rd\u00fc\u011f\u00fcn\u00fcz gibi yaz\u0131yorum.2. parametresine ise,\r\nthis(yani bu formu) g\u00f6nderiyorum.Buraya g\u00f6nderilen object de\u011fer,Y metodunun\r\nIAsyncResult tipinden olan dd adl\u0131 parametresine g\u00f6nderilecektir.\r\n*\/\r\n        }\r\n        void Y(IAsyncResult dd)\r\n        {\r\n\/*Bu metoddaki IAsyncResult tipinden dd parametresine gelen de\u011fer,\r\nAsyncState \u00f6zelli\u011finden elde edilebilir.*\/\r\n        }\r\n<\/pre>\n<p>\u015eimdi program\u0131m\u0131z\u0131 derleyip \u00e7al\u0131\u015ft\u0131r\u0131rsak e\u011fer,buton1&#8217;e t\u0131klad\u0131\u011f\u0131m\u0131zda a\u015fa\u011f\u0131daki hatayla kar\u015f\u0131laca\u011f\u0131z \ud83d\ude42<br \/>\n&#8220;Cross-thread operation not valid: Control &#8216;Form1&#8217; accessed from a thread other than the thread it was created on.&#8221;<br \/>\nBu hata,threadlardan olu\u015fuyor.Threadler \u00e7ak\u0131\u015f\u0131yor.<br \/>\nFormun load\u0131na, ya da button1 in Click \u00f6zelli\u011finin ilk sat\u0131r\u0131na \u015fu kodu yazarsan\u0131z hata vermeyecektir.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\nCheckForIllegalCrossThreadCalls = false;\r\n\/*&quot;Cross-thread operation not valid: Control 'Form1'\r\n accessed from a thread other than the thread it was created on.&quot;\r\nhatas\u0131 vermemesi i\u00e7in yaz\u0131l\u0131r.Threadlerin \u00e7ak\u0131\u015fmas\u0131n\u0131 engeller.*\/\r\n<\/pre>\n<p>Son olarak program\u0131m\u0131z\u0131 derleyip \u00e7al\u0131\u015ft\u0131rd\u0131ktan sonra, formumuzun Text&#8217;inde saniyeleri g\u00f6r\u00fcrken, formumuzda ba\u015fka i\u015flemler yapabilece\u011fiz(kapat,b\u00fcy\u00fct,k\u00fc\u00e7\u00fct,ta\u015f\u0131 vs.).Art\u0131k X metodundaki while d\u00f6ng\u00fcs\u00fc Senkron de\u011fil Asenkron \u00e7al\u0131\u015fmaktad\u0131r.Asenkron while d\u00f6ng\u00fcs\u00fc bitmeden , ondan ba\u011f\u0131ms\u0131z di\u011fer i\u015flemlerimizide ger\u00e7ekle\u015ftirebiliyoruz.<\/p>\n<p>\u0130\u015fte bu \u015fekilde Asenkron \u00e7al\u0131\u015f\u0131p, ayn\u0131 anda birden fazla i\u015flem yapabilirsiniz..<\/p>\n<p>Bir sonraki yaz\u0131mda g\u00f6r\u00fc\u015fmek \u00fczere..<br \/>\n\u0130yi \u00e7al\u0131\u015fmalar.<\/p>\n<!-- AddThis Advanced Settings generic via filter on the_content --><!-- AddThis Share Buttons generic via filter on the_content -->","protected":false},"excerpt":{"rendered":"<p>Bu yaz\u0131mda C#&#8217;ta Asenkron mimarisini inceleyece\u011fiz.Bir program ak\u0131\u015f\u0131nda bir i\u015flem bitmeden ba\u015fka bir i\u015flem yap\u0131lmaz.Asenkron mimari bize, s\u00fcre\u00e7lerin birbirinden ba\u011f\u0131ms\u0131z ayn\u0131 anda \u00e7al\u0131\u015fmas\u0131n\u0131 sunuyor.C#&#8217;ta Asenkron mimarisini uygulamak i\u00e7in iki yap\u0131 mevcuttur.Bunlardan biri Asenkron Metodlar&#46;&#46;&#46;<!-- AddThis Advanced Settings generic via filter on get_the_excerpt --><!-- AddThis Share Buttons generic via filter on get_the_excerpt --><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[12],"tags":[],"class_list":["post-285","post","type-post","status-publish","format-standard","hentry","category-c-sharp-c"],"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/285","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/comments?post=285"}],"version-history":[{"count":0,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/285\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/media?parent=285"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/categories?post=285"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/tags?post=285"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}