﻿
{"id":4463,"date":"2016-06-17T17:11:17","date_gmt":"2016-06-17T17:11:17","guid":{"rendered":"http:\/\/www.gencayyildiz.com\/blog\/?p=4463"},"modified":"2016-06-17T17:11:17","modified_gmt":"2016-06-17T17:11:17","slug":"cta-async-await-ikilisiyle-asenkron-islemler","status":"publish","type":"post","link":"https:\/\/www.gencayyildiz.com\/blog\/cta-async-await-ikilisiyle-asenkron-islemler\/","title":{"rendered":"C#&#8217;ta async &#8211; await \u0130kilisiyle ASenkron \u0130\u015flemler"},"content":{"rendered":"<div id=\"fb-root\"><\/div>\n<p>Merhaba<\/p>\n<p>Asenkron mimari dendi\u011fi vakit benim akl\u0131ma <a href=\"http:\/\/www.gencayyildiz.com\/blog\/cta-asenkron-mimarisi\/\" target=\"_blank\">Delegate(Delege)<\/a> yap\u0131lar\u0131 ve BeginInvoke metodlar\u0131 gelmektedir. Bunlar\u0131n d\u0131\u015f\u0131nda Asenkron i\u015flemler i\u00e7in bir \u00e7ok Thread yap\u0131s\u0131yla beraber async ve await ikilisiylede asenkron \u00e7al\u0131\u015fmalar ger\u00e7ekle\u015ftirebiliriz. \u0130\u015fte bu i\u00e7eri\u011fimizde async &#8211; await ikilisini ele alaca\u011f\u0131z.<\/p>\n<p>\u00d6ncelikle C# Framework&#8217;\u00fc ile gelen haz\u0131r Async fonksiyonlar\u0131n\u0131 ele alal\u0131m.<\/p>\n<p>\u00d6rne\u011fin;<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n        private void button1_Click(object sender, EventArgs e)\r\n        {\r\n            WebClient web = new WebClient();\r\n            string Gelen = web.DownloadString(new Uri(&quot;http:\/\/www.gencayyildiz.com&quot;));\r\n            MessageBox.Show(Gelen);\r\n        }\r\n<\/pre>\n<p>yukar\u0131da g\u00f6rd\u00fc\u011f\u00fcn\u00fcz gibi WebClient s\u0131n\u0131f\u0131n\u0131 ele alal\u0131m. DownloadString metoduna verdi\u011fimiz url adresin t\u00fcm kaynak komutlar\u0131n\u0131 string olarak elde etmemizi sa\u011flamaktad\u0131r. Bu komutu denedi\u011finiz zaman hafif bir bekleme s\u00fcresi oldu\u011funu g\u00f6receksiniz. Bunun sebebi \u015fuanda senkron bir yakla\u015f\u0131m sergilememizdir.<\/p>\n<p><a href=\"http:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2016\/06\/Cta-async-await-\u0130kilisiyle-ASenkron-\u0130\u015flemler.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-4465\" src=\"http:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2016\/06\/Cta-async-await-\u0130kilisiyle-ASenkron-\u0130\u015flemler.jpg\" alt=\"C#'ta async - await \u0130kilisiyle ASenkron \u0130\u015flemler\" width=\"266\" height=\"225\" \/><\/a><\/p>\n<p>Dikkat ederseniz her metodun ayriyetten Async versiyonuda mevcuttur. Biliniz ki, .NET Framework&#8217;de yap\u0131land\u0131r\u0131lm\u0131\u015f \u00e7o\u011fu s\u0131n\u0131f\u0131n metodlar\u0131n\u0131n Async versiyonlar\u0131 olacakt\u0131r. <em>Peki ne i\u015fe yaramaktad\u0131r bu Async uzant\u0131l\u0131 versiyonlar?<\/em> diye sorarsan\u0131z e\u011fer yap\u0131lan i\u015flemin asenkron temelli ele al\u0131nmas\u0131n\u0131 sa\u011flamaktad\u0131rlar.<\/p>\n<p>\u015eimdi yukar\u0131daki \u00f6rnek kodumuzu asenkron olarak ele alal\u0131m.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n        private async void button1_Click(object sender, EventArgs e)\r\n        {\r\n            WebClient web = new WebClient();\r\n            string Gelen = await web.DownloadStringTaskAsync(new Uri(&quot;http:\/\/www.gencayyildiz.com&quot;));\r\n            MessageBox.Show(Gelen);\r\n        }\r\n<\/pre>\n<p>DownloadString metodunun DownloadStringTaskAsync versiyonunu kullan\u0131rsak yapt\u0131\u011f\u0131m\u0131z i\u015flem asenkron olarak ger\u00e7ekle\u015ftirilecektir.<br \/>\nAmaaa&#8230;<br \/>\nDikkat ederseniz bu i\u015flemin asenkron olabilmesi i\u00e7in async ve await komutlar\u0131yla \u00fczerinde \u00e7al\u0131\u015ft\u0131\u011f\u0131m\u0131z metodu tazelememiz gerekmektedir.<\/p>\n<p>O halde neler yapt\u0131k? detayl\u0131 konu\u015fal\u0131m.<br \/>\nDownloadStringTaskAsync metodunu await komutuyla i\u015faretleyerek verilen url adresindeki kayna\u011f\u0131 string tipinde asenkron olarak elde etmek istedik. Bu i\u015flemi ger\u00e7ekle\u015ftirebilmek i\u00e7inde \u00e7al\u0131\u015ft\u0131\u011f\u0131m\u0131z metodu async komutu ile i\u015faretledik.<\/p>\n<p>Bu demek oluyor ki,<\/p>\n<ul>\n<li><strong><em>async<\/em><\/strong>; i\u00e7erisinde asenkron i\u015flem yap\u0131lacak metodu belirtir. Benzer ifadeyle, i\u00e7erisinde asenkron i\u015flem yapaca\u011f\u0131m\u0131z metodu <strong>async<\/strong> keyword\u00fc ile i\u015faretlemeliyiz.<\/li>\n<li>Yukar\u0131daki \u00f6rnekte g\u00f6rd\u00fc\u011f\u00fcn\u00fcz gibi olaylarda(event) dahil olmak \u00fczere i\u00e7erisinde asenkron i\u015flem yap\u0131lacak t\u00fcm metodlar <strong><em>async<\/em><\/strong> ile i\u015faretlenmek zorundad\u0131r.<\/li>\n<li><strong><em>asnyc<\/em><\/strong> ile i\u015faretlenmi\u015f bir metodda asenkron \u00e7al\u0131\u015facak komutlar <strong><em>await<\/em><\/strong> ile i\u015faretlenir.<\/li>\n<li><strong><em>async<\/em><\/strong> ile i\u015faretlenmi\u015f metodun geri d\u00f6n\u00fc\u015f tipi; void, Task veyahut Task&lt;T&gt; geri d\u00f6n\u00fc\u015f tiplerinde olmal\u0131d\u0131r.<\/li>\n<li><strong><em>await<\/em><\/strong>; sadece <strong><em>async<\/em><\/strong> ile i\u015faretlenmi\u015f metodlarda kullan\u0131labilir.<\/li>\n<li><strong><em>async<\/em><\/strong> ile i\u015faretlenmi\u015f bir metod birden fazla <strong><em>await<\/em><\/strong> kullanabilir.<\/li>\n<\/ul>\n<p>\u015feklinde genelleme yapabiliriz.<\/p>\n<p><strong><em>Peki, bir asenkron metod nas\u0131l olu\u015fturulur?<\/em><\/strong> sorusuna gelirsek&#8230;<br \/>\nUnutmay\u0131n ki, async ve await keywordleriyle kendi metodlar\u0131n\u0131zda asenkron bir yakla\u015f\u0131m uygulamak istiyorsan\u0131z Task s\u0131n\u0131f\u0131n\u0131 akl\u0131n\u0131zdan \u00e7\u0131karmayacaks\u0131n\u0131z.<\/p>\n<p>\u00d6rnek olarak,<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n        void X() {\r\n            int Sayac = 1;\r\n            while (true)\r\n            {\r\n                label1.Text = Sayac.ToString();\r\n                Sayac++;\r\n            }\r\n        }\r\n<\/pre>\n<p>senkron metodunu ele al\u0131rsak, asenkron yapmak i\u00e7in a\u015fa\u011f\u0131daki gibi \u00e7al\u0131\u015faca\u011f\u0131z.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n        Task X()\r\n        {\r\n            return Task.Run(() =&gt;\r\n            {\r\n                int Sayac = 1;\r\n                while (true)\r\n                {\r\n                    label1.Text = Sayac.ToString();\r\n                    Sayac++;\r\n                }\r\n            });\r\n        }\r\n<\/pre>\n<p>\u00d6rnektede g\u00f6rd\u00fc\u011f\u00fcn\u00fcz gibi void&#8217;e kar\u015f\u0131l\u0131k Task tipini kullanmaktay\u0131z. Bu asenkron i\u015fleme haz\u0131r olu\u015fturulmu\u015f metodun kullan\u0131m\u0131 a\u015fa\u011f\u0131daki gibidir.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n        private async void button1_Click(object sender, EventArgs e)\r\n        {\r\n            await X();\r\n        }\r\n<\/pre>\n<p>Anlayaca\u011f\u0131n\u0131z await Task yahut Task&lt;T&gt; tipinden metodlara \u00f6zg\u00fc keywordd\u00fcr.<\/p>\n<p>\u015eimdide geriye de\u011fer d\u00f6nd\u00fcren ve parametre alan bir metod \u00fczerinde asenkron \u00e7al\u0131\u015fmam\u0131z\u0131 ger\u00e7ekle\u015ftirelim.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n        Task&lt;double&gt; Don(double BaslangicDegeri, double BitisDegeri)\r\n        {\r\n            Task&lt;double&gt; islem = Task.Run&lt;double&gt;(() =&gt;\r\n            {\r\n                while (true)\r\n                {\r\n                    if (BaslangicDegeri == BitisDegeri)\r\n                        break;\r\n                    label1.Text = BaslangicDegeri.ToString();\r\n                    BaslangicDegeri++;\r\n                }\r\n                return BaslangicDegeri;\r\n            });\r\n\r\n            return islem;\r\n        }\r\n<\/pre>\n<p>G\u00f6rd\u00fc\u011f\u00fcn\u00fcz gibi Don metodunu asenkron olarak in\u015fa edece\u011fimizden dolay\u0131 Task&lt;double&gt; tipinden de\u011fer d\u00f6nmekte ve i\u00e7erisinde Task.Run metodu ile gerekli i\u015flemleri icra etmektedir. Son olarak Run metodu i\u00e7erisinde d\u00f6nece\u011fi double de\u011feri return etmekte ve Don metodu komple Task&lt;double&gt; nesnesini geriye return etmektedir.<\/p>\n<p>Kullan\u0131m\u0131 a\u015fa\u011f\u0131daki gibidir.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n        private async void button1_Click(object sender, EventArgs e)\r\n        {\r\n            MessageBox.Show((await Don(1000, 10000)).ToString());\r\n        }\r\n<\/pre>\n<p>Sonucu asenkron bir i\u015flem neticesinde mesaj kutusunda elde edilecektir.<\/p>\n<p>Ve son olarak a\u015fa\u011f\u0131daki kod blo\u011funu inceleyiniz.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n        private async void button1_Click(object sender, EventArgs e)\r\n        {\r\n            MessageBox.Show(&quot;Test1&quot;);\r\n            MessageBox.Show((await Don(1000, 10000)).ToString());\r\n            MessageBox.Show(&quot;Test2&quot;);\r\n        }\r\n<\/pre>\n<p>Biraz \u00f6nce yazm\u0131\u015f oldu\u011fumuz Don isimli metod ile yukar\u0131da bir i\u015flem ger\u00e7ekle\u015ftirdik. Bu olay\u0131 tetikledi\u011fimiz zaman await metodu sadece Don metodunu g\u00f6rd\u00fc\u011f\u00fcnden dolay\u0131 asenkron i\u015flem sade ve sadece Don metoduna uygulanacak, komple button1_Click isimli olay i\u00e7erisinde ceyran etmeyecektir. Dolay\u0131s\u0131yla, ekranda \u00f6ncelikle &#8220;Test1&#8221;, ard\u0131ndan Don metodunun neticesi ve onunda ard\u0131ndan &#8220;Test2&#8221; de\u011ferlerini g\u00f6rece\u011fiz. Buradaki i\u015flevleride komple asenkron bir \u015fekilde ger\u00e7ekle\u015ftirmek ve kod s\u0131ras\u0131 g\u00f6zetmeksizin bu komutlar\u0131da kendi aralar\u0131nda asenkron bir i\u015flevde g\u00f6rmek istiyorsak a\u015fa\u011f\u0131daki gibi bir \u00e7al\u0131\u015fma yapmam\u0131z yeterli olacakt\u0131r.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n        Task ASenkron()\r\n        {\r\n            return Task.Run(() =&gt;\r\n            {\r\n                MessageBox.Show(&quot;Test1&quot;);\r\n                Don(1000, 10000);\r\n                MessageBox.Show(&quot;Test2&quot;);\r\n            });\r\n        }\r\n<\/pre>\n<p>Evet, bu i\u015flemden sonra a\u015fa\u011f\u0131daki gibi metodu \u00e7a\u011f\u0131r\u0131p asenkron \u00e7al\u0131\u015ft\u0131rabilirsiniz.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n        private async void button1_Click(object sender, EventArgs e)\r\n        {\r\n            await ASenkron();\r\n        }\r\n<\/pre>\n<p>async ve await komutlar\u0131 g\u00fczel ve pratik bir asenkron yap\u0131land\u0131rmas\u0131 sunsada \u015fahsen Delegate&#8217;lerin tad\u0131 ayr\u0131yd\u0131 benim i\u00e7in \ud83d\ude42 Tabi ki de, her\u015feyi yeri ve zaman\u0131 gelince kullanman\u0131n verimlili\u011fi o yap\u0131ya \u00f6zel doruklarda ya\u015fanmaktad\u0131r. O y\u00fczden metodlar\u0131 bellek adreslerinden temsil edip asenkron i\u015flev uygulamak istiyorsan\u0131z Delegate&#8217;leri, yok e\u011fer temel s\u0131n\u0131flar\u0131n\u0131zda asenkron i\u015flev uygulayacaksan\u0131z tabi ki de async ve await komutlar\u0131n\u0131 kullanmak en makuludur.<\/p>\n<p>Okudu\u011funuz i\u00e7in te\u015fekk\u00fcr ederim&#8230;<br \/>\nSonraki yaz\u0131lar\u0131mda g\u00f6r\u00fc\u015fmek \u00fczere&#8230;<br \/>\n\u0130yi \u00e7al\u0131\u015fmalar dilerim&#8230;<\/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>Merhaba Asenkron mimari dendi\u011fi vakit benim akl\u0131ma Delegate(Delege) yap\u0131lar\u0131 ve BeginInvoke metodlar\u0131 gelmektedir. Bunlar\u0131n d\u0131\u015f\u0131nda Asenkron i\u015flemler i\u00e7in bir \u00e7ok Thread yap\u0131s\u0131yla beraber async ve await ikilisiylede asenkron \u00e7al\u0131\u015fmalar ger\u00e7ekle\u015ftirebiliriz. \u0130\u015fte bu i\u00e7eri\u011fimizde async&#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":3223,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[12,338,720],"tags":[579,1236,1233,1234,1237,169,528,1235,783],"class_list":["post-4463","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-c-sharp-c","category-c-5-0","category-c-6-0","tag-asenkron","tag-asenkron-mimari","tag-async","tag-await","tag-begininvoke","tag-delegate","tag-delege","tag-thread","tag-webclient"],"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/4463","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=4463"}],"version-history":[{"count":0,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/4463\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/media\/3223"}],"wp:attachment":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/media?parent=4463"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/categories?post=4463"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/tags?post=4463"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}