﻿
{"id":12236,"date":"2019-10-22T21:25:49","date_gmt":"2019-10-22T21:25:49","guid":{"rendered":"https:\/\/www.gencayyildiz.com\/blog\/?p=12236"},"modified":"2019-10-22T21:25:49","modified_gmt":"2019-10-22T21:25:49","slug":"c-8-0-iasyncenumerablet-ve-iasyncenumeratort-arayuzleri-ile-asenkron-iterasyonel-islev-olusturma","status":"publish","type":"post","link":"https:\/\/www.gencayyildiz.com\/blog\/c-8-0-iasyncenumerablet-ve-iasyncenumeratort-arayuzleri-ile-asenkron-iterasyonel-islev-olusturma\/","title":{"rendered":"C# 8.0 &#8211; IAsyncEnumerable&lt;T&gt; ve IAsyncEnumerator&lt;T&gt; Aray\u00fczleri \u0130le Asenkron Iterasyonel \u0130\u015flev Olu\u015fturma"},"content":{"rendered":"<div id=\"fb-root\"><\/div>\n<p>Merhaba,<\/p>\n<p>\u00d6nceki <a href=\"https:\/\/www.gencayyildiz.com\/blog\/cta-ienumerable-ve-ienumerator-interfaceleri-nedir-ve-nasil-kullanilir\/\" rel=\"noopener noreferrer\" target=\"_blank\">C#\u2019ta IEnumerable ve IEnumerator Interfaceleri Nedir? ve Nas\u0131l Kullan\u0131l\u0131r?<\/a> ba\u015fl\u0131kl\u0131 makalemde IEnumerable ve IEnumerator interfaceleri \u00fczerine uzun uzun konu\u015fmu\u015ftuk. Bu i\u00e7eri\u011fimizde ise ilgili interfacelerin asenkron altyap\u0131da \u015fekillendirildi\u011fi C# 8.0 ile gelen yeni hallerini(<span style=\"font-size:11px;\">IAsyncEnumerable&lt;T&gt; ve IAsyncEnumerator&lt;T&gt;<\/span>) konu\u015faca\u011f\u0131z. <\/p>\n<p>\u015eimdi yukar\u0131da adresini verdi\u011fim makalemizide referans alarak konuyu en temelden hat\u0131rlayarak ele alal\u0131m. Yaz\u0131l\u0131mda iterasyon dendi\u011finde akla ilk olarak foreach geldi\u011fini biliyoruz. Dolay\u0131s\u0131yla bizler foreach d\u00f6ng\u00fcs\u00fc ile iterasyonel bir yap\u0131da olan t\u00fcm referanslar \u00fczerinde i\u015flemler yapabilmekteyiz. Hatta kendi custom s\u0131n\u0131flar\u0131m\u0131za iterasyonel \u00f6zellik kazand\u0131rabilmek ve foreach ile \u00fczerinde i\u015flem yapabilmemiz i\u00e7in IEnumerable interface&#8217;ini kullanmaktay\u0131z.  IEnumerable&#8217;\u0131 hat\u0131rlama mahiyetinde referans ald\u0131\u011f\u0131m\u0131z kaynaktan ilgili yap\u0131ya dair al\u0131nt\u0131da bulunal\u0131m;<\/p>\n<blockquote><p><em  style=\"color:orange;\">&#8230;IEnumerable interface\u2019i ise bir s\u0131n\u0131fa foreach mekanizmas\u0131 taraf\u0131ndan tan\u0131nmas\u0131 i\u00e7in gerekli yetenekleri\/nitelikleri kazand\u0131r\u0131r. Yani enumerator yap\u0131s\u0131n\u0131&#8230; <\/em><span style=font-size:10px;\">Kaynak : <a href=\"https:\/\/www.gencayyildiz.com\/blog\/cta-ienumerable-ve-ienumerator-interfaceleri-nedir-ve-nasil-kullanilir\/\" rel=\"noopener noreferrer\" target=\"_blank\">C#\u2019ta IEnumerable ve IEnumerator Interfaceleri Nedir? ve Nas\u0131l Kullan\u0131l\u0131r?<\/a><\/span><\/p><\/blockquote>\n<p>foreach d\u00f6ng\u00fcs\u00fc bir referans \u00fczerinde i\u015flev g\u00f6recekse e\u011fer o referans\u0131n s\u0131n\u0131f\u0131 i\u00e7erisinde geriye IEnumerator d\u00f6nd\u00fcren ve ad\u0131n\u0131nda GetEnumerator oldu\u011fu bir metodun bulunmas\u0131n\u0131 \u015fart ko\u015fmaktad\u0131r. <em><strong>Nedir bu GetEnumerator metodu?<\/strong><\/em> diye sorarsan\u0131z e\u011fer yine a\u015fa\u011f\u0131daki al\u0131nt\u0131ya g\u00f6z atabilirsiniz.<\/p>\n<blockquote><p><em  style=\"color:orange;\">&#8230;GetEnumerator metodu, bir s\u0131n\u0131fa iterasyon yap\u0131lar\u0131n\u0131 kazand\u0131racak \u00f6zellikleri bar\u0131nd\u0131ran IEnumerator nesnesi d\u00f6nen bir metotdur&#8230;<\/em><span style=font-size:10px;\">Kaynak : <a href=\"https:\/\/www.gencayyildiz.com\/blog\/cta-ienumerable-ve-ienumerator-interfaceleri-nedir-ve-nasil-kullanilir\/\" rel=\"noopener noreferrer\" target=\"_blank\">C#\u2019ta IEnumerable ve IEnumerator Interfaceleri Nedir? ve Nas\u0131l Kullan\u0131l\u0131r?<\/a><\/span><\/p><\/blockquote>\n<p>Nihayetinde burada ortaya \u00e7\u0131kan sonu\u00e7; IEnumerable interfaceinin uyguland\u0131\u011f\u0131 s\u0131n\u0131fa zorla GetEnumerator isimli metot implement ettirilmektedir. IEnumerator ise ilgili s\u0131n\u0131fa iterasyon i\u015fleminde kullan\u0131lacak elemanlar\u0131 ve \u00f6zellikleri kazand\u0131rmaktan sorumlu olacakt\u0131r.<\/p>\n<p>Buraya kadar ele ald\u0131\u011f\u0131m\u0131z t\u00fcm yap\u0131lanma kendi s\u0131n\u0131flar\u0131m\u0131za iterasyonel bir \u00f6zellik kazand\u0131rmak i\u00e7in kulland\u0131\u011f\u0131m\u0131z materyallerdir. C# 8.0, bu s\u0131n\u0131flar\u0131n asenkron kar\u015f\u0131l\u0131klar\u0131 olarak d\u00fc\u015fenebilece\u011fimiz Asynchronous Streams ba\u015fl\u0131\u011f\u0131 alt\u0131ndaki <strong>IAsyncEnumerable&lt;T&gt;<\/strong> ve <strong>IAsyncEnumerator&lt;T&gt;<\/strong> alternatiflerini getirmi\u015f bulunmaktad\u0131r.<\/p>\n<blockquote><p>C# 8.0&#8217;da gelen Asynchronous Streams(<strong>IAsyncEnumerable&lt;T&gt;<\/strong> ve <strong>IAsyncEnumerator&lt;T&gt;<\/strong>) yap\u0131lar\u0131 sayesinde foreach d\u00f6ng\u00fcs\u00fc <a href=\"https:\/\/www.gencayyildiz.com\/blog\/cta-async-await-ikilisiyle-asenkron-islemler\/\" rel=\"noopener noreferrer\" target=\"_blank\">await<\/a> keyword\u00fc ile asenkron i\u015flenebilir hale gelmi\u015ftir.<\/p><\/blockquote>\n<p>\u015eimdi custom olu\u015fturdu\u011fumuz bir s\u0131n\u0131f\u0131 <em>IAsyncEnumerable&lt;T&gt;<\/em> interfacei ile t\u00fcretelim ve ard\u0131ndan bir ba\u015fka s\u0131n\u0131fa <em>IAsyncEnumerator&lt;T&gt;<\/em> interfacei ile de gerekli iterasyonel yetenekleri kazand\u0131rarak foreach d\u00f6ng\u00fcs\u00fcnde asenkron i\u015flemlerimizi ger\u00e7ekle\u015ftirelim.<\/p>\n<p>Burada senaryo olarak elimizdeki bir say\u0131sal listeyi temsil eden custom s\u0131n\u0131f\u0131m\u0131zda asenkron olarak foreach d\u00f6ng\u00fcs\u00fcnde d\u00f6nmeyi inceleyelim.<\/p>\n<p>\u0130lk olarak <strong>Enumerator<\/strong> nesnesini olu\u015ftural\u0131m.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    class MyEnumerator : IAsyncEnumerator&lt;int&gt;\r\n    {\r\n        List&lt;int&gt; numbers;\r\n        public MyEnumerator(List&lt;int&gt; numbers) =&gt; this.numbers = numbers;\r\n        int currentIndex = -1;\r\n        public int Current =&gt; numbers&#x5B;currentIndex];\r\n        public ValueTask DisposeAsync()\r\n        {\r\n            Console.WriteLine(&quot;\u0130terasyon sona erdi.&quot;);\r\n            return new ValueTask(Task.CompletedTask);\r\n        }\r\n        public ValueTask&lt;bool&gt; MoveNextAsync()\r\n        {\r\n            Task.Delay(1000).Wait();\r\n            return new ValueTask&lt;bool&gt;(++currentIndex &lt; numbers.Count);\r\n        }\r\n    }\r\n<\/pre>\n<p>Ard\u0131ndan koleksiyonel \u00f6zellik kazand\u0131raca\u011f\u0131m\u0131z s\u0131n\u0131f\u0131m\u0131z\u0131 olu\u015ftural\u0131m.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    class MyList : IAsyncEnumerable&lt;int&gt;\r\n    {\r\n        List&lt;int&gt; numbers = new List&lt;int&gt;();\r\n        public IAsyncEnumerator&lt;int&gt; GetAsyncEnumerator(CancellationToken cancellationToken = default) =&gt; new MyEnumerator(numbers);\r\n        public void Add(int number) =&gt; numbers.Add(number);\r\n    }\r\n<\/pre>\n<p>Ve son olarak kullanal\u0131m;<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    class Program\r\n    {\r\n        static void Main(string&#x5B;] args)\r\n        {\r\n            Do().Wait();\r\n        }\r\n\r\n        static async Task Do()\r\n        {\r\n            MyList myList = new MyList();\r\n            myList.Add(1);\r\n            myList.Add(3);\r\n            myList.Add(5);\r\n            myList.Add(7);\r\n            myList.Add(9);\r\n            await foreach (var number in myList)\r\n                Console.WriteLine(number);\r\n        }\r\n    }\r\n<\/pre>\n<p>Uygulamay\u0131 derleyip \u00e7al\u0131\u015ft\u0131rd\u0131\u011f\u0131n\u0131zda foreach d\u00f6ng\u00fcs\u00fcn\u00fcn asenkron bir \u015fekilde ilgili koleksiyon \u00fczerinde i\u015flem yapt\u0131\u011f\u0131n\u0131 a\u015fa\u011f\u0131daki ekran g\u00f6r\u00fcnt\u00fcs\u00fcnde oldu\u011fu gibi g\u00f6rebilirsiniz.<br \/>\n<a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2019\/10\/C-8.0-IAsyncEnumerableltTgt-ve-IAsyncEnumeratorltTgt-Aray\u00fczleri-\u0130le-Asenkron-Iterasyonel-\u0130\u015flev-Olu\u015fturma.gif\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2019\/10\/C-8.0-IAsyncEnumerableltTgt-ve-IAsyncEnumeratorltTgt-Aray\u00fczleri-\u0130le-Asenkron-Iterasyonel-\u0130\u015flev-Olu\u015fturma.gif\" alt=\"C# 8.0 - IAsyncEnumerable&lt;T&gt; ve IAsyncEnumerator&lt;T&gt; Aray\u00fczleri \u0130le Asenkron Iterasyonel \u0130\u015flev Olu\u015fturma\" width=\"596\" height=\"490\" class=\"aligncenter size-full wp-image-12265\" \/><\/a><\/p>\n<p>\u0130lgilenenlerin faydalanmas\u0131 dile\u011fiyle&#8230;<br \/>\nSonraki yaz\u0131lar\u0131mda g\u00f6r\u00fc\u015fmek \u00fczere&#8230;<br \/>\n\u0130yi \u00e7al\u0131\u015fmalar&#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, \u00d6nceki C#\u2019ta IEnumerable ve IEnumerator Interfaceleri Nedir? ve Nas\u0131l Kullan\u0131l\u0131r? ba\u015fl\u0131kl\u0131 makalemde IEnumerable ve IEnumerator interfaceleri \u00fczerine uzun uzun konu\u015fmu\u015ftuk. Bu i\u00e7eri\u011fimizde ise ilgili interfacelerin asenkron altyap\u0131da \u015fekillendirildi\u011fi C# 8.0 ile gelen yeni&#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":11028,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[3033,2857],"tags":[3029,3031,3032],"class_list":["post-12236","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-net-core-3-0","category-c-8-0","tag-asynchronous-streams","tag-iasyncenumerable","tag-iasyncenumerator"],"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/12236","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=12236"}],"version-history":[{"count":30,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/12236\/revisions"}],"predecessor-version":[{"id":12267,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/12236\/revisions\/12267"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/media\/11028"}],"wp:attachment":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/media?parent=12236"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/categories?post=12236"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/tags?post=12236"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}