{"id":8479,"date":"2010-11-04T22:45:40","date_gmt":"2010-11-04T20:45:40","guid":{"rendered":"https:\/\/fatihboy.com\/post\/csharp5-kolaylasan-asenkron-islemleri"},"modified":"2010-11-04T22:45:40","modified_gmt":"2010-11-04T20:45:40","slug":"csharp5-kolaylasan-asenkron-islemleri","status":"publish","type":"post","link":"https:\/\/fatihboy.com\/en\/csharp5-kolaylasan-asenkron-islemleri\/","title":{"rendered":"C# 5, Async ile Kolayla\u015fan Asenkron \u0130\u015flemleri"},"content":{"rendered":"<p>&nbsp;&nbsp; PDC 2010 ard\u0131ndan yazd\u0131\u011f\u0131m ve C#\u2019\u0131n bir sonraki s\u00fcr\u00fcm\u00fcnde bizleri bekleyen yeni \u00f6zellikleri sizlerle <a href=\"\/en\/?p=8462\">payla\u015ft\u0131\u011f\u0131m yaz\u0131mda<\/a> <a href=\"http:\/\/msdn.microsoft.com\/en-gb\/vstudio\/async.aspx\">Visual Studio Async CTP<\/a> bahsetmi\u015ftim. Visual Studio 2010 \u00fczerine kurulan CTP paketi arka planda derleyiciyi de g\u00fcncelleyerek yeni tan\u0131\u015ft\u0131\u011f\u0131m\u0131z asenkron anahtar kelimelerinin desteklenmesini sa\u011fl\u0131yor. \u0130sterseniz Visual Studio Async CTP ve devam\u0131nda da .Net framework\u2019\u00fcn yeni s\u00fcr\u00fcm\u00fcnde&nbsp; (<em>5.0 ?<\/em>) asenkron programlama konusunda bizleri bekleyen bu \u00f6nemli de\u011fi\u015fikli\u011fi inceleyelim.<\/p>\n\n\n\n<p>&nbsp;&nbsp; Visual Studio Async CTP\u2019yi indirip kurdu\u011funuzda C#\u2019a (<em>ve Visual Basic.Net\u2019e<\/em>) eklenmi\u015f iki yeni anahtar kelimeyi kullanmaya ba\u015flayabilirsiniz; <strong>async<\/strong> ve <strong>await<\/strong>. \u0130lk denemelerinizde hemen farkedece\u011finiz gibi bu anahtar kelimeler sadece .Net Framework 4 projelerinde kullan\u0131labilir durumda. Bunun temel nedeni yeni asenkron \u00f6zelliklerin arkaplanda .Net framework 4 ile birlikte tan\u0131\u015ft\u0131\u011f\u0131m\u0131z Task fonksyonalitesini kullanmas\u0131d\u0131r. Derleyici, async ve await kulland\u0131\u011f\u0131m\u0131z noktalara derleme-zaman\u0131nda m\u00fcdahale ederek kodumuzu asenkron bir yap\u0131ya d\u00f6n\u00fc\u015ft\u00fcrmektedir.<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp; Dile eklenen yeni anahtar kelimelerden <strong>async<\/strong>, kod i\u00e7erisinde asenkron bir fonksiyon tan\u0131mlamas\u0131 yapmam\u0131za olanak vermektedir. async kullan\u0131m\u0131nda dikkat edilmesi gereken \u00f6nemli bir nokta; bu anahtar kelime ile i\u015faretlenen fonksiyonlar\u0131n sadece <em>void<\/em> (bo\u015f), <em>Task<\/em> ya da <em>Task&lt;T&gt;<\/em> t\u00fcr\u00fcnden bir geri d\u00f6n\u00fc\u015f tipine sahip olabilecekleridir.<\/p>\n\n\n\n<p>&nbsp;&nbsp; async anahtar kelimesini kullanarak tan\u0131mlad\u0131\u011f\u0131m\u0131z fonksiyonlarda, derleyecinin bizim ad\u0131m\u0131za m\u00fcdahale ederek kodumuzu asenkron bir yap\u0131ya d\u00f6n\u00fc\u015ft\u00fcrebilmesi i\u00e7in uygun yerler belirtmemiz\/<em>i\u015faretlememiz<\/em> gerekecektir. Bu ama\u00e7la async d\u0131\u015f\u0131nda&nbsp; <strong>await<\/strong> anahtar kelimesi de eklenmi\u015ftir. async ile tan\u0131mlanarak aseknron yap\u0131da kullan\u0131lmas\u0131n\u0131 istedi\u011fimiz bir fonksiyon i\u00e7erisinde en az bir await ifadesi yer almal\u0131d\u0131r; aksi takdirde derleyiciye fonksiyonu asenkron tan\u0131mla dedi\u011fimiz halde asenkron yap\u0131labilecek bir i\u015flem belirtmedi\u011fimizden mant\u0131kl\u0131 bir yap\u0131 ortaya \u00e7\u0131kmayacakt\u0131r. await anahtar kelimesi ile ilgili d\u00fc\u015f\u00fclmesi gereken \u00f6nemli bir notta; anahtar kelimenin sadece <em>Task<\/em> ya da <em>Task&lt;T&gt;<\/em> t\u00fcr\u00fcnden de\u011fer d\u00f6nen fonksiyonlar i\u00e7in kullanabiliyor olmas\u0131d\u0131r. Bunun sebebi de yukar\u0131da da bahsetti\u011fim gibi tan\u0131\u015ft\u0131\u011f\u0131m\u0131z bu yeni anahtar kelimelerin asl\u0131nda arka planda .Net framework 4 ile birlikte gelen Task fonksiyonalitesini kullanmas\u0131d\u0131r.<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp; Dile eklenen bu iki anahtar kelime d\u0131\u015f\u0131nda, yaz\u0131l\u0131m geli\u015ftiricilerin yeni fonksiyonliteleri h\u0131zl\u0131ca kullanabilmesi ad\u0131na, mevcut pek \u00e7ok k\u00fct\u00fcphaneye de eklemeler yap\u0131lm\u0131\u015f durumda. Bu eklemeler i\u00e7in akl\u0131ma gelen ilk \u00f6rnek ise WebClient s\u0131n\u0131f\u0131na eklenen <strong>DownloadStringTaskAsync<\/strong> fonksiyonudur.<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp; Bu noktada ak\u0131llara \u015fu soru gelebilir; Visual Studio Async CTP ile birlikte bu eklemelerin oldu\u011fu t\u00fcm k\u00fct\u00fcphanelerin yeni s\u00fcr\u00fcmleri mi geldi? Daha da \u00f6nemlisi istemci taraf\u0131nda .Net framework\u2019\u00fc m\u00fc de\u011fi\u015fiyor? Yeni bir s\u00fcr\u00fcm m\u00fc kurmal\u0131y\u0131m? Hemen i\u00e7inizi rahatlatay\u0131m; CTP ile birlikte ne bu k\u00fct\u00fcphanelerin yeni s\u00fcr\u00fcmleri geldi, ne de istemciye yeni bir framework kurulumu yap\u0131lmas\u0131 gerekli. Yeni k\u00fct\u00fcphane s\u00fcr\u00fcmleri yok, peki yeni \u00f6zellikleri nas\u0131l kullabiliyorum? Bu noktada geli\u015ftiriciler olduk\u00e7a ak\u0131ll\u0131ca bir i\u015fe imza atarak mevcut k\u00fct\u00fcphaneleri de\u011fi\u015ftirmek yerine bu k\u00fct\u00fcphanelerdeki s\u0131n\u0131flara geni\u015fletme (<em>extension<\/em>) fonksiyonlar\u0131 yard\u0131m\u0131yla yeni \u00f6zellikleri katmay\u0131 se\u00e7mi\u015fler. Yapman\u0131z gereken sadace projenizde Visual Studio Async CTP ile birlikte gelen <strong>AsyncCtpLibrary.dll<\/strong> assembly\u2019sine referans g\u00f6stermek. Bu assembly CTP kurulumu s\u0131ras\u0131nda GAC\u2019a kay\u0131t edilmedi\u011fi i\u00e7in referans olarak <em>&#8220;%userprofile%\\My Documents\\Microsoft Visual Studio Async CTP\\Samples&#8221; <\/em>klas\u00f6r\u00fc i\u00e7erisindeki assembly\u2019yi kullanmal\u0131s\u0131n\u0131z. Refarans\u0131 eklemeniz sonras\u0131nda yeni eklenen asenkron fonksiyonlar\u0131 kullanabilirsiniz. .Net framework\u2019\u00fcn bir sonraki s\u00fcr\u00fcm\u00fcnde bu fonksiyonaliteler ilgili s\u0131n\u0131flar\u0131n i\u00e7erisinde yeralaca\u011f\u0131ndan <em>bu \u015fekilde bir kullan\u0131ma ihtiya\u00e7 kalmayacakt\u0131r<\/em>.<\/p>\n\n\n\n<p>&nbsp;&nbsp; San\u0131r\u0131m \u015fimdilik Visual Studio Async CTP hakk\u0131nda bu kadar teorik bilgi yeterli olacakt\u0131r. Konunun peki\u015fmesi ad\u0131na yaz\u0131m\u0131n geri kalan\u0131nda, biz yaz\u0131l\u0131mc\u0131lar\u0131n en fazla tercih etti\u011fi \u015fekilde, \u00f6rnek bir kod \u00fczerinde devam etmek daha iyi olacakt\u0131r.<\/p>\n\n\n\n<p>&nbsp;&nbsp; A\u015fa\u011f\u0131da, bu konu hakk\u0131ndaki en basit (<em>ve san\u0131r\u0131m en yayg\u0131n<\/em>) \u00f6rneklerden birisini bulabilirsiniz. \u00d6rnekte; aray\u00fczde yer alan bir butona bas\u0131lmas\u0131yla kullan\u0131c\u0131 taraf\u0131ndan tetiklenen bir fonksiyon yer almakta. Fonksiyon, olu\u015fturdu\u011fu bir WebClient \u00f6rne\u011fi \u00fczerinden web sayfas\u0131 i\u00e7eri\u011fini string olarak almakta, ard\u0131ndan da i\u00e7erisindeki url\u2019ler bulunarak adresListesi (<em>listbox<\/em>) \u00fczerinde listelemekte.<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"csharp\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">private void adresleriBul_Click(object sender, EventArgs e) {\n    var adress = \"https:\/\/fatihboy.com\/\";\n    var icerik = new WebClient().DownloadString(adress);\n    var eslesimler = Regex.Matches(icerik,\n                        @\"(?&lt;Protocol>\\w+):\\\/\\\/(?&lt;Domain>[\\w@][\\w.:@]+)\\\/?[\\w\\.?=%&amp;=\\-@\/$,]*\",\n                        RegexOptions.IgnoreCase);\n \n    foreach (Match eslesim in eslesimler) {\n        adresListesi.Items.Add(eslesim.Value);\n    }\n}<\/pre>\n\n\n\n<p>&nbsp;&nbsp; Uygulaman\u0131n \u00e7al\u0131\u015ft\u0131\u011f\u0131 sistemin ve web uygulamas\u0131n\u0131n bulundu\u011fu kar\u015f\u0131 sistemin h\u0131zl\u0131 bir internet ba\u011flant\u0131s\u0131 olmas\u0131 durumunda bu kodda kullan\u0131c\u0131y\u0131 etkileyen herhangi bir durum olu\u015fmayacakt\u0131r; ki bu iyi bir sanaryodur. K\u00f6t\u00fc senaryoda ise (<em>b\u00fcy\u00fck olas\u0131l\u0131kla sahada olacak olan da bu senaryodur<\/em>), sistemlerden en az birisinde yo\u011funluk\/yava\u015flama olacakt\u0131r; bu durumda da kar\u015f\u0131 uygulamadan yan\u0131t al\u0131nana kadar kendi uygulaman\u0131z\u0131n aray\u00fcz\u00fc yan\u0131t veremecek ve bu durumda kullan\u0131c\u0131\/m\u00fc\u015fteri taraf\u0131ndan \u201ck\u00f6t\u00fc uygulama\u201d, \u201cdonmalar oluyor\u201d v.b. \u015fekillerde olumsuz yorumlanacakt\u0131r.<\/p>\n\n\n\n<p>&nbsp;&nbsp; Kar\u015f\u0131 sistemdeki yava\u015fl\u0131k s\u0131ras\u0131nda uygulama aray\u00fcz\u00fcn\u00fcz\u00fcn yan\u0131t veremiyor olmas\u0131n\u0131n nedeni yukar\u0131daki fonksiyonun <em>aray\u00fcz ile ayn\u0131 thread \u00fczerinde \u00e7al\u0131\u015f\u0131yor olmas\u0131d\u0131r<\/em>. Uygulaman\u0131z bu fonksiyondan \u00e7\u0131kmad\u0131\u011f\u0131 s\u00fcrece aray\u00fcz i\u015flemleri yap\u0131lamayaca\u011f\u0131ndan ekran\u0131 ta\u015f\u0131ma, tazeleme v.b. i\u015flemler yap\u0131lamayacakt\u0131r. Problemin \u00e7\u00f6z\u00fcm\u00fc de i\u015fi ayr\u0131 bir thread \u00fczerine ta\u015f\u0131yarak uygulama ana thread\u2019ini me\u015fgul etmeyerek aray\u00fcz\u00fcn kendi i\u015flevlerini yerine getirmesine devam etmesini sa\u011flamakt\u0131r; fakat bu i\u015f her zaman g\u00f6r\u00fcnd\u00fc\u011f\u00fc kadar kolay olmayacakt\u0131r.<\/p>\n\n\n\n<p>&nbsp;&nbsp; Yukar\u0131daki \u00f6rnek kodumuzu thread\u2019li olarak yeniden d\u00fczenleyecek olursak y\u00f6netmemiz gereken pek \u00e7ok yeni i\u015f olacakt\u0131r. Thread\u2019lerin ba\u015flamas\u0131-bitmesi, hatalar\u0131n y\u00f6netilmesi ve hatta e\u015fle\u015fen adreslerin adresListesine eklenmesi noktas\u0131nda aray\u00fcz thread\u2019i ile yeniden senkronize olmak gerekecektir. Basit uygulamalarda bu i\u015flemler fazla i\u015f y\u00fck\u00fc olu\u015fturmasa da b\u00fcy\u00fck kurumsal uygulamalarda, \u00f6zellikle de harici sistemlerle s\u0131k s\u0131k ileti\u015fim kuruyorlarsa, \u00f6nemli bir i\u015f y\u00fck\u00fcne neden olacakt\u0131r. A\u015fa\u011f\u0131da uygulaman\u0131n thread kullan\u0131larak yaz\u0131lm\u0131\u015f bir versiyonunu bulabilirsiniz;<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"csharp\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">delegate void EslesimleriEkleCallback(MatchCollection eslesimler);\n \nprivate void adresleriBul_Click(object sender, EventArgs e) {\n    var islem = new Thread(new ThreadStart(AdressleriBul));\n \n    islem.Start();\n}\n \nprivate void AdressleriBul() {\n    var adress = \"https:\/\/fatihboy.com\/\";\n    var icerik = new WebClient().DownloadString(adress);\n    var eslesimler = Regex.Matches(icerik, \n                        @\"(?&lt;Protocol>\\w+):\\\/\\\/(?&lt;Domain>[\\w@][\\w.:@]+)\\\/?[\\w\\.?=%&amp;=\\-@\/$,]*\", \n                        RegexOptions.IgnoreCase);\n \n    if (adresListesi.InvokeRequired) {\/\/Fonksiyon ayr\u0131 thread\u2019den \u00e7a\u011f\u0131r\u0131lm\u0131\u015f\n        var callback = new EslesimleriEkleCallback(EslesimleriEkle);\n        Invoke(callback, new[] { eslesimler });\n    }\n    else { \/\/Ayn\u0131 thread, do\u011frudan \u00e7a\u011f\u0131r\u0131labilir\n        EslesimleriEkle(eslesimler);\n    }\n \n             \n}\n \nprivate void EslesimleriEkle(MatchCollection eslesimler) {\n    foreach (Match eslesim in eslesimler) {\n        adresListesi.Items.Add(eslesim.Value);\n    }\n}<\/pre>\n\n\n\n<p>&nbsp;&nbsp; Tam da bu noktada, y\u00f6netilmesi ve kontrol edilmesi gereken pek \u00e7ok i\u015f ve giderek karma\u015f\u0131kla\u015fan bir kod olu\u015fmaya ba\u015flarken, Visual Studio Async CTP ve beraberinde gelen async ve await anahtar kelimelerin kullan\u0131m\u0131 ile yukar\u0131daki kodumuz kolayl\u0131kla a\u015fa\u011f\u0131daki gibi asenkron \u00e7al\u0131\u015fmaya ba\u015flayacakt\u0131r;<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"csharp\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">private async void adresleriBul_Click(object sender, EventArgs e) {\n    var adress = \"https:\/\/fatihboy.com\/\";\n    var icerik = await new WebClient().DownloadStringTaskAsync(adress);\n    var eslesimler = Regex.Matches(icerik,\n                        @\"(?&lt;Protocol>\\w+):\\\/\\\/(?&lt;Domain>[\\w@][\\w.:@]+)\\\/?[\\w\\.?=%&amp;=\\-@\/$,]*\",\n                        RegexOptions.IgnoreCase);\n \n    foreach (Match eslesim in eslesimler) {\n        adresListesi.Items.Add(eslesim.Value);\n    }\n}<\/pre>\n\n\n\n<p>&nbsp;&nbsp; Yukar\u0131daki kodu bir ilk hali ile k\u0131yaslayacak olursak sadece ve sadece 3 noktada de\u011fi\u015fiklik oldu\u011funu g\u00f6rebiliriz. Karma\u015f\u0131k kodlama mant\u0131klar\u0131 yok, senkronize edilmesi\/y\u00f6netilmesi gereken threadler yok, daha&nbsp; da \u00f6nemlisi spagetti kod yok. Kodumuzun birinci sat\u0131r\u0131nda fonksiyonumuzu asenkron olarak i\u015faretliyoruz, 3. sat\u0131r\u0131nda i\u015flemin asenkron olarak beklenece\u011fini belirtiyoruz, son olarak da yine 3. sat\u0131r\u0131nda WebClient s\u0131n\u0131f\u0131 i\u00e7in Visual Studio Async CTP i\u00e7erisinde yaz\u0131lm\u0131\u015f olan extension fonksiyonu (<em>DownloadStringTaskAsync<\/em>) kullan\u0131l\u0131yoruz. DownloadStringTaskAsync fonksiyonu geriye <em>Task&lt;string&gt;<\/em> t\u00fcr\u00fcnden bir de\u011fer d\u00f6nmekte ve derleme esnas\u0131nda bu yap\u0131 bizim i\u00e7in derleyici taraf\u0131ndan asenkron olarak yeniden yaz\u0131lacakt\u0131r. \u00dcstelik t\u00fcm bunlar yap\u0131l\u0131rken siz arkaplandaki thread senkronizasyonu v.b. i\u015flemler \u00fczerinde de zaman harcam\u0131yorsunuz; \u00f6rne\u011fin normalde yukar\u0131daki kodumuzda adresListesi\u2019ne de\u011ferleri eklerken \u00f6ncelikle ana threadimizle senkron olmam\u0131z gerekiyorken Async ile birlikte bunlar bizim ad\u0131m\u0131za yap\u0131l\u0131yor. Harika de\u011fil mi!<\/p>\n\n\n\n<p>&nbsp; Derleyicinin bizim i\u00e7in kodumuzu nas\u0131l de\u011fi\u015ftirdi\u011fini ise uygulamam\u0131z\u0131 reflector ile a\u00e7arak g\u00f6rebiliriz;<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"csharp\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">private void adresleriBul_Click(object sender, EventArgs e) {\n    &lt;adresleriBul_Click>d__0 d__ = new &lt;adresleriBul_Click>d__0(0);\n    d__.&lt;>4__this = this;\n    d__.sender = sender;\n    d__.e = e;\n    d__.MoveNextDelegate = new Action(d__.MoveNext);\n    d__.$builder = VoidAsyncMethodBuilder.Create();\n    d__.MoveNext();\n}<\/pre>\n\n\n\n<p>&nbsp;&nbsp;&nbsp; Durun bir dakika bu bizim yazd\u0131\u011f\u0131m\u0131z kod de\u011fil! \ud83d\ude42<\/p>\n\n\n\n<p>&nbsp;&nbsp; Derleyici olduk\u00e7a de\u011fi\u015ftirmi\u015f de\u011fil mi! Peki bu koddaki <strong>d__0<\/strong> s\u0131n\u0131f\u0131 nedir? A\u015fa\u011f\u0131da bulabilece\u011finiz bu s\u0131n\u0131f\u0131 da g\u00f6rerek derleyicinin i\u015f mant\u0131\u011f\u0131m\u0131z\u0131 nas\u0131l yorumlad\u0131\u011f\u0131n\u0131 daha rahat g\u00f6rebilirsiniz:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"csharp\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">[CompilerGenerated]\nprivate sealed class &lt;adresleriBul_Click>d__0 {\n    private bool $__disposing;\n    private bool $__doFinallyBodies;\n    public VoidAsyncMethodBuilder $builder;\n    private int &lt;>1__state;\n    public EventArgs &lt;>3__e;\n    public object &lt;>3__sender;\n    public AnaEkran &lt;>4__this;\n    private string &lt;1>t__$await5;\n    private TaskAwaiter&lt;string> &lt;a1>t__$await6;\n    public string &lt;adress>5__1;\n    public Match &lt;eslesim>5__4;\n    public MatchCollection &lt;eslesimler>5__3;\n    public string &lt;icerik>5__2;\n    public EventArgs e;\n    public Action MoveNextDelegate;\n    public object sender;\n \n    [DebuggerHidden]\n    public &lt;adresleriBul_Click>d__0(int &lt;>1__state) {\n        this.&lt;>1__state = &lt;>1__state;\n    }\n \n    [DebuggerHidden]\n    public void Dispose() {\n        this.$__disposing = true;\n        this.MoveNext();\n        this.&lt;>1__state = -1;\n    }\n \n    public void MoveNext() {\n        try {\n            this.$__doFinallyBodies = true;\n            if (this.&lt;>1__state != 1) {\n                if (this.&lt;>1__state == -1) {\n                    return;\n                }\n \n                this.&lt;adress>5__1 = \"https:\/\/fatihboy.com\/\";\n                this.&lt;a1>t__$await6 = new WebClient().DownloadStringTaskAsync(this.&lt;adress>5__1).GetAwaiter&lt;string>();\n                this.&lt;>1__state = 1;\n                this.$__doFinallyBodies = false;\n                if (this.&lt;a1>t__$await6.BeginAwait(this.MoveNextDelegate)) {\n                    return;\n                }\n                this.$__doFinallyBodies = true;\n            }\n \n            this.&lt;>1__state = 0;\n            this.&lt;1>t__$await5 = this.&lt;a1>t__$await6.EndAwait();\n            this.&lt;icerik>5__2 = this.&lt;1>t__$await5;\n            this.&lt;eslesimler>5__3 = Regex.Matches(this.&lt;icerik>5__2, \n                           @\"(?&lt;Protocol>\\w+):\\\/\\\/(?&lt;Domain>[\\w@][\\w.:@]+)\\\/?[\\w\\.?=%&amp;=\\-@\/$,]*\", \n   RegexOptions.IgnoreCase);\n            IEnumerator CS$5$0002 = this.&lt;eslesimler>5__3.GetEnumerator();\n            try {\n                while (CS$5$0002.MoveNext()) {\n                    this.&lt;eslesim>5__4 = (Match) CS$5$0002.Current;\n                    this.&lt;>4__this.adresListesi.Items.Add(this.&lt;eslesim>5__4.Value);\n                }\n            }\n            finally {\n                if (this.$__doFinallyBodies) {\n                    IDisposable CS$0$0003 = CS$5$0002 as IDisposable;\n                    if (CS$0$0003 != null) {\n                        CS$0$0003.Dispose();\n                    }\n                }\n            }\n            this.&lt;>1__state = -1;\n            this.$builder.SetCompleted();\n        }\n        catch (Exception) {\n            this.&lt;>1__state = -1;\n            this.$builder.SetCompleted();\n            throw;\n        }\n    }\n}<\/pre>","protected":false},"excerpt":{"rendered":"<p>&nbsp;&nbsp; PDC 2010 ard\u0131ndan yazd\u0131\u011f\u0131m ve C#\u2019\u0131n bir sonraki s\u00fcr\u00fcm\u00fcnde bizleri bekleyen yeni \u00f6zellikleri sizlerle payla\u015ft\u0131\u011f\u0131m yaz\u0131mda Visual Studio Async CTP bahsetmi\u015ftim. Visual Studio 2010 \u00fczerine kurulan CTP paketi arka planda derleyiciyi de g\u00fcncelleyerek yeni tan\u0131\u015ft\u0131\u011f\u0131m\u0131z asenkron anahtar kelimelerinin desteklenmesini sa\u011fl\u0131yor. \u0130sterseniz Visual Studio Async CTP ve devam\u0131nda da .Net framework\u2019\u00fcn yeni s\u00fcr\u00fcm\u00fcnde&nbsp; (5.0 ?)&#8230;<\/p>\n<p><a class=\"read-more\" href=\"https:\/\/fatihboy.com\/en\/csharp5-kolaylasan-asenkron-islemleri\/\">Read More<\/a><\/p>","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[77,28],"tags":[113,41],"class_list":["post-8479","post","type-post","status-publish","format-standard","hentry","category-csharp","category-turkce","tag-async","tag-c"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v26.7 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>C# 5, Async ile Kolayla\u015fan Asenkron \u0130\u015flemleri - Fatih Boy<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/fatihboy.com\/en\/csharp5-kolaylasan-asenkron-islemleri\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"C# 5, Async ile Kolayla\u015fan Asenkron \u0130\u015flemleri - Fatih Boy\" \/>\n<meta property=\"og:description\" content=\"&nbsp;&nbsp; PDC 2010 ard\u0131ndan yazd\u0131\u011f\u0131m ve C#\u2019\u0131n bir sonraki s\u00fcr\u00fcm\u00fcnde bizleri bekleyen yeni \u00f6zellikleri sizlerle payla\u015ft\u0131\u011f\u0131m yaz\u0131mda Visual Studio Async CTP bahsetmi\u015ftim. Visual Studio 2010 \u00fczerine kurulan CTP paketi arka planda derleyiciyi de g\u00fcncelleyerek yeni tan\u0131\u015ft\u0131\u011f\u0131m\u0131z asenkron anahtar kelimelerinin desteklenmesini sa\u011fl\u0131yor. \u0130sterseniz Visual Studio Async CTP ve devam\u0131nda da .Net framework\u2019\u00fcn yeni s\u00fcr\u00fcm\u00fcnde&nbsp; (5.0 ?)...Read More\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihboy.com\/en\/csharp5-kolaylasan-asenkron-islemleri\/\" \/>\n<meta property=\"og:site_name\" content=\"Fatih Boy\" \/>\n<meta property=\"article:published_time\" content=\"2010-11-04T20:45:40+00:00\" \/>\n<meta name=\"author\" content=\"Fatih Boy\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Fatih Boy\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"10 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/fatihboy.com\/csharp5-kolaylasan-asenkron-islemleri\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihboy.com\/csharp5-kolaylasan-asenkron-islemleri\/\"},\"author\":{\"name\":\"Fatih Boy\",\"@id\":\"https:\/\/fatihboy.com\/#\/schema\/person\/6b06a41d42eed36eaa0780fbeb774158\"},\"headline\":\"C# 5, Async ile Kolayla\u015fan Asenkron \u0130\u015flemleri\",\"datePublished\":\"2010-11-04T20:45:40+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihboy.com\/csharp5-kolaylasan-asenkron-islemleri\/\"},\"wordCount\":1430,\"commentCount\":2,\"publisher\":{\"@id\":\"https:\/\/fatihboy.com\/#\/schema\/person\/6b06a41d42eed36eaa0780fbeb774158\"},\"keywords\":[\"Async\",\"C#\"],\"articleSection\":[\"C#\",\"T\u00fcrk\u00e7e\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/fatihboy.com\/csharp5-kolaylasan-asenkron-islemleri\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihboy.com\/csharp5-kolaylasan-asenkron-islemleri\/\",\"url\":\"https:\/\/fatihboy.com\/csharp5-kolaylasan-asenkron-islemleri\/\",\"name\":\"C# 5, Async ile Kolayla\u015fan Asenkron \u0130\u015flemleri - Fatih Boy\",\"isPartOf\":{\"@id\":\"https:\/\/fatihboy.com\/#website\"},\"datePublished\":\"2010-11-04T20:45:40+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihboy.com\/csharp5-kolaylasan-asenkron-islemleri\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihboy.com\/csharp5-kolaylasan-asenkron-islemleri\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihboy.com\/csharp5-kolaylasan-asenkron-islemleri\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/fatihboy.com\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"C# 5, Async ile Kolayla\u015fan Asenkron \u0130\u015flemleri\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/fatihboy.com\/#website\",\"url\":\"https:\/\/fatihboy.com\/\",\"name\":\"Fatih Boy\",\"description\":\"Ki\u015fisel Web Sitesi\",\"publisher\":{\"@id\":\"https:\/\/fatihboy.com\/#\/schema\/person\/6b06a41d42eed36eaa0780fbeb774158\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/fatihboy.com\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\/\/fatihboy.com\/#\/schema\/person\/6b06a41d42eed36eaa0780fbeb774158\",\"name\":\"Fatih Boy\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/fatihboy.com\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/5b3de123ad95a2ffe30b75a54cee98b55f65185c6d6805b35088a3d945f2feb4?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/5b3de123ad95a2ffe30b75a54cee98b55f65185c6d6805b35088a3d945f2feb4?s=96&d=mm&r=g\",\"caption\":\"Fatih Boy\"},\"logo\":{\"@id\":\"https:\/\/fatihboy.com\/#\/schema\/person\/image\/\"},\"sameAs\":[\"https:\/\/fatihboy.com\"],\"url\":\"https:\/\/fatihboy.com\/en\/author\/fatih\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"C# 5, Async ile Kolayla\u015fan Asenkron \u0130\u015flemleri - Fatih Boy","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/fatihboy.com\/en\/csharp5-kolaylasan-asenkron-islemleri\/","og_locale":"en_US","og_type":"article","og_title":"C# 5, Async ile Kolayla\u015fan Asenkron \u0130\u015flemleri - Fatih Boy","og_description":"&nbsp;&nbsp; PDC 2010 ard\u0131ndan yazd\u0131\u011f\u0131m ve C#\u2019\u0131n bir sonraki s\u00fcr\u00fcm\u00fcnde bizleri bekleyen yeni \u00f6zellikleri sizlerle payla\u015ft\u0131\u011f\u0131m yaz\u0131mda Visual Studio Async CTP bahsetmi\u015ftim. Visual Studio 2010 \u00fczerine kurulan CTP paketi arka planda derleyiciyi de g\u00fcncelleyerek yeni tan\u0131\u015ft\u0131\u011f\u0131m\u0131z asenkron anahtar kelimelerinin desteklenmesini sa\u011fl\u0131yor. \u0130sterseniz Visual Studio Async CTP ve devam\u0131nda da .Net framework\u2019\u00fcn yeni s\u00fcr\u00fcm\u00fcnde&nbsp; (5.0 ?)...Read More","og_url":"https:\/\/fatihboy.com\/en\/csharp5-kolaylasan-asenkron-islemleri\/","og_site_name":"Fatih Boy","article_published_time":"2010-11-04T20:45:40+00:00","author":"Fatih Boy","twitter_card":"summary_large_image","twitter_misc":{"Written by":"Fatih Boy","Est. reading time":"10 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fatihboy.com\/csharp5-kolaylasan-asenkron-islemleri\/#article","isPartOf":{"@id":"https:\/\/fatihboy.com\/csharp5-kolaylasan-asenkron-islemleri\/"},"author":{"name":"Fatih Boy","@id":"https:\/\/fatihboy.com\/#\/schema\/person\/6b06a41d42eed36eaa0780fbeb774158"},"headline":"C# 5, Async ile Kolayla\u015fan Asenkron \u0130\u015flemleri","datePublished":"2010-11-04T20:45:40+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihboy.com\/csharp5-kolaylasan-asenkron-islemleri\/"},"wordCount":1430,"commentCount":2,"publisher":{"@id":"https:\/\/fatihboy.com\/#\/schema\/person\/6b06a41d42eed36eaa0780fbeb774158"},"keywords":["Async","C#"],"articleSection":["C#","T\u00fcrk\u00e7e"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/fatihboy.com\/csharp5-kolaylasan-asenkron-islemleri\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/fatihboy.com\/csharp5-kolaylasan-asenkron-islemleri\/","url":"https:\/\/fatihboy.com\/csharp5-kolaylasan-asenkron-islemleri\/","name":"C# 5, Async ile Kolayla\u015fan Asenkron \u0130\u015flemleri - Fatih Boy","isPartOf":{"@id":"https:\/\/fatihboy.com\/#website"},"datePublished":"2010-11-04T20:45:40+00:00","breadcrumb":{"@id":"https:\/\/fatihboy.com\/csharp5-kolaylasan-asenkron-islemleri\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihboy.com\/csharp5-kolaylasan-asenkron-islemleri\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fatihboy.com\/csharp5-kolaylasan-asenkron-islemleri\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/fatihboy.com\/"},{"@type":"ListItem","position":2,"name":"C# 5, Async ile Kolayla\u015fan Asenkron \u0130\u015flemleri"}]},{"@type":"WebSite","@id":"https:\/\/fatihboy.com\/#website","url":"https:\/\/fatihboy.com\/","name":"Fatih Boy","description":"Ki\u015fisel Web Sitesi","publisher":{"@id":"https:\/\/fatihboy.com\/#\/schema\/person\/6b06a41d42eed36eaa0780fbeb774158"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/fatihboy.com\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":["Person","Organization"],"@id":"https:\/\/fatihboy.com\/#\/schema\/person\/6b06a41d42eed36eaa0780fbeb774158","name":"Fatih Boy","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/fatihboy.com\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/5b3de123ad95a2ffe30b75a54cee98b55f65185c6d6805b35088a3d945f2feb4?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/5b3de123ad95a2ffe30b75a54cee98b55f65185c6d6805b35088a3d945f2feb4?s=96&d=mm&r=g","caption":"Fatih Boy"},"logo":{"@id":"https:\/\/fatihboy.com\/#\/schema\/person\/image\/"},"sameAs":["https:\/\/fatihboy.com"],"url":"https:\/\/fatihboy.com\/en\/author\/fatih\/"}]}},"brizy_media":[],"_links":{"self":[{"href":"https:\/\/fatihboy.com\/en\/wp-json\/wp\/v2\/posts\/8479","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/fatihboy.com\/en\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/fatihboy.com\/en\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/fatihboy.com\/en\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/fatihboy.com\/en\/wp-json\/wp\/v2\/comments?post=8479"}],"version-history":[{"count":0,"href":"https:\/\/fatihboy.com\/en\/wp-json\/wp\/v2\/posts\/8479\/revisions"}],"wp:attachment":[{"href":"https:\/\/fatihboy.com\/en\/wp-json\/wp\/v2\/media?parent=8479"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihboy.com\/en\/wp-json\/wp\/v2\/categories?post=8479"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihboy.com\/en\/wp-json\/wp\/v2\/tags?post=8479"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}