﻿
{"id":5492,"date":"2016-12-24T08:09:47","date_gmt":"2016-12-24T08:09:47","guid":{"rendered":"http:\/\/www.gencayyildiz.com\/blog\/?p=5492"},"modified":"2016-12-24T08:11:41","modified_gmt":"2016-12-24T08:11:41","slug":"cta-task-fromresult-metodu","status":"publish","type":"post","link":"https:\/\/www.gencayyildiz.com\/blog\/cta-task-fromresult-metodu\/","title":{"rendered":"C#&#8217;ta Task.FromResult Metodu"},"content":{"rendered":"<div id=\"fb-root\"><\/div>\n<p>Merhaba,<\/p>\n<p>Programlama yap\u0131lar\u0131 \u00fczerine \u00e7al\u0131\u015fmalar\u0131n yan\u0131nda harici yaz\u0131l\u0131-g\u00f6rsel materyaller \u00fczerinden de genel kamuoyu takibimede devam etmekteyim. Haliyle ge\u00e7enlerde oturmu\u015f \u015f\u00f6yle blogda\u015flar \u00fczerinde bir g\u00f6z gezdirmekteyken Syn. <a href=\"http:\/\/www.ilkayilknur.com\/task-fromresult-metodu-ne-is-yapar-nerede-kullanilir\" target=\"_blank\">\u0130lkay \u0130lknur<\/a> hocam\u0131z\u0131n adreste verdi\u011fim makalesinde basit ama olduk\u00e7a etkili bir konuyla kar\u015f\u0131la\u015ft\u0131m. Birazdan bizimde detayland\u0131raca\u011f\u0131m\u0131z bu konuda \u0130lkay Hocam\u0131z benimde farkl\u0131 yakla\u015f\u0131mlar sergiledi\u011fim bir duruma Task.FromResult metodunu tan\u0131mlayarak \u00e7\u00f6z\u00fcm \u00fcretmemizi tavsiye etmektedir. \u015eimdi gelin; hangi durumda, ne ama\u00e7la Task.FromResult metodunu kullanaca\u011f\u0131m\u0131z\u0131 inceleyelim.<\/p>\n<p>Biliyoruz ki, Task s\u0131n\u0131f\u0131 herhangi bir asenkron operasyonun \u00e7al\u0131\u015fma s\u00fcrecindeki t\u00fcm bilgilerini tutan bir s\u0131n\u0131ft\u0131r. Haliyle async ve await komutlar\u0131 Task tipinden faydalanarak gereken yap\u0131lar\u0131 olu\u015fturmakta ve s\u00fcrecin asenkron bir \u015fekilde ilerlemesini sa\u011flamaktad\u0131rlar.<\/p>\n<p>\u015eimdi konumuzun derinliklerine yava\u015f yava\u015f girelim. \u00d6ncelikle a\u015fa\u011f\u0131daki kod blo\u011funu inceleyiniz.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n        static Task&lt;int&gt; OrnekMetod()\r\n        {\r\n            ...\r\n        }\r\n<\/pre>\n<p>Yukar\u0131da g\u00f6rm\u00fc\u015f oldu\u011funuz metod Task&lt;int&gt; tipinde geri d\u00f6n\u00fc\u015f de\u011ferine sahip bir metoddur. Bu metodun \u00e7al\u0131\u015fabilmesi i\u00e7in\u00a0Task&lt;int&gt; tipinde bir de\u011feri geriye d\u00f6nd\u00fcrmesi gerekmektedir. Bu gereksinimi gidermek i\u00e7in Task tipine \u00f6zel \u00fc\u00e7 farkl\u0131 durumu a\u015fa\u011f\u0131daki gibi g\u00f6z \u00f6n\u00fcne alal\u0131m;<\/p>\n<ul>\n<li>\n<strong>1. Durum<\/strong><br \/>\nMakalemizin \u00fcst sat\u0131rlar\u0131nda belirtti\u011fimiz gibi Task tipi asenkron yap\u0131lanma i\u00e7in \u00f6zel bir tiptir ve async &#8211; await komutlar\u0131 bu tipi kullanarak gerekli yap\u0131lanmay\u0131 sa\u011flamaktad\u0131r. Yani anlayaca\u011f\u0131n\u0131z ilgili metodumuz async &#8211; await keywordleri kullanaca\u011f\u0131 zaman otomatik olarak belirtilen tipte geriye bir de\u011fer d\u00f6nd\u00fcrecektir. \u015e\u00f6yle ki;<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n        static async Task&lt;int&gt; OrnekMetod()\r\n        {\r\n            return 123;\r\n        }\r\n<\/pre>\n<p>G\u00f6r\u00fcld\u00fc\u011f\u00fc \u00fczere async keyword\u00fc ile metodumuzu i\u015faretledi\u011fim zaman geriye direkt olarak &#8220;123&#8221; de\u011ferini g\u00f6nderebilmekteyim. Compiler async komutu sayesinde bu metodun bir asenkron s\u00fcre\u00e7 ge\u00e7irebilece\u011fini alg\u0131lamakta ve i\u00e7erisindeki geri d\u00f6n\u00fc\u015f de\u011ferini Task tipiyle otomatik olarak return etmektedir. Kendi g\u00f6zlerinizle g\u00f6rmek i\u00e7in buyrun;<br \/>\n<a href=\"http:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2016\/12\/Cta-Task.FromResult-Metodu.png\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2016\/12\/Cta-Task.FromResult-Metodu.png\" alt=\"C#&#039;ta Task.FromResult Metodu\" width=\"351\" height=\"271\" class=\"aligncenter size-full wp-image-5504\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2016\/12\/Cta-Task.FromResult-Metodu.png 351w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2016\/12\/Cta-Task.FromResult-Metodu-300x232.png 300w\" sizes=\"auto, (max-width: 351px) 100vw, 351px\" \/><\/a><\/p>\n<p>Ee tabi ki de bu i\u015fi async komutu Task tipiyle sa\u011flamaktad\u0131r. E\u011fer ki, async komutu olmaks\u0131z\u0131n &#8220;123&#8221; de\u011ferini return etmeye \u00e7al\u0131\u015fsayd\u0131k ak\u0131betimiz a\u015fa\u011f\u0131dakinden farks\u0131z olacakt\u0131r.<br \/>\n<a href=\"http:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2016\/12\/Cta-Task.FromResult-Metodu-1.png\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2016\/12\/Cta-Task.FromResult-Metodu-1.png\" alt=\"C#&#039;ta Task.FromResult Metodu\" width=\"209\" height=\"67\" class=\"aligncenter size-full wp-image-5506\" \/><\/a>\n<\/li>\n<li>\n<strong>2. Durum<\/strong><br \/>\nBildi\u011finiz Task&lt;int&gt; tipinde bir nesne olu\u015fturup geri d\u00f6nd\u00fcrmektedir.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n        static Task&lt;int&gt; OrnekMetod()\r\n        {\r\n            return new Task&lt;int&gt;(() =&gt; { return 123; });\r\n        }\r\n<\/pre>\n<p>Bu \u015fekilde bir \u00e7\u00f6z\u00fcm \u00e7okta akl\u0131 selim bir uygulama de\u011fildir. Nihayetinde Task \u00f6rne\u011fi olu\u015fturabilmek i\u00e7in bir metoda ihtiyac\u0131m\u0131z var ki ben \u00f6rnekte Lambda olarak ifade etmekteyim.<\/p>\n<p>Ya da <\/p>\n<p>Task.Run metodunu kullanarak ihtiyac\u0131m\u0131z\u0131 da giderebilirdik.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n        static Task&lt;int&gt; OrnekMetod()\r\n        {\r\n            return Task.Run&lt;int&gt;(() =&gt; { return 123; });\r\n        }\r\n<\/pre>\n<p>Tabi ki de Task.Run metodunu bu kadar ucuz i\u015flemler i\u00e7in ve bilin\u00e7siz bir \u015fekilde kullanmaman\u0131z\u0131 \u00f6neririm. Ayriyetten g\u00f6r\u00fcld\u00fc\u011f\u00fc \u00fczere Task.Run metoduda i\u00e7erisinde metod istemektedir.\n<\/li>\n<li>\n<strong>3. Durum<\/strong><br \/>\n1. durumumuzda g\u00f6r\u00fcld\u00fc\u011f\u00fc \u00fczere async &#8211; await komutlar\u0131 devreye sokuldu\u011fu zaman Task nesnesi yaratmadan direkt ilgili de\u011feri return edebiliyoruz. 2. durumda da g\u00f6r\u00fcld\u00fc\u011f\u00fc \u00fczere ortada bir asenkron operasyon yokken Task yaratmak durumunda kal\u0131yoruz. \u0130\u015fte bu 3. durum asl\u0131nda 2. duruma bir alternatif olarak sunaca\u011f\u0131m ve konumuzun aslen i\u00e7eri\u011fini te\u015fkil edecek k\u0131s\u0131md\u0131r.<\/p>\n<p>E\u011fer ki yap\u0131lacak i\u015flem asenkron bir yakla\u015f\u0131m sergilemeyecek ve geriye Task tipinde bir de\u011fer d\u00f6nd\u00fcrmemiz gerekecekse Task.FromResult metodunu kullanmam\u0131z yeterlidir. Task.FromResult metodu; yeni bir Task nesnesi yaratarak, yarat\u0131lan bu nesnenin g\u00f6revlerinin tamamlanm\u0131\u015f olarak i\u015faretlenmesini ve parametre olarak verilen de\u011ferin g\u00f6revin sonucu olarak belirlemesini sa\u011flayacak bir metotdur. K\u0131saca;<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n        static Task&lt;int&gt; OrnekMetod()\r\n        {\r\n            return Task.FromResult(123);\r\n        }\r\n<\/pre>\n<p>Bu \u015fekilde Task.FromResult metodu sayesinde tamamlanm\u0131\u015f bir Task objesi yaratm\u0131\u015f olduk ve de\u011fer olarakta &#8220;123&#8221; de\u011ferini geri d\u00f6nd\u00fcrm\u00fc\u015f olduk.\n<\/li>\n<\/ul>\n<h3>Baz\u0131 Durumlarda Senkron, Baz\u0131 Durumlarda ASenkron Metod<\/h3>\n<p>Bu i\u015flem i\u00e7in a\u015fa\u011f\u0131daki kod blo\u011funu inceleyiniz.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    class Odeme\r\n    {\r\n        public async void TahsilatYap(double Tutar)\r\n        {\r\n            try\r\n            {\r\n                var Sonuc = await Tahsilat(Tutar);\r\n                Console.WriteLine(Sonuc);\r\n            }\r\n            catch (Exception e)\r\n            {\r\n                Console.WriteLine(e.Message);\r\n            }\r\n        }\r\n        Task&lt;bool&gt; Tahsilat(double Tutar)\r\n        {\r\n            if (Tutar &lt; 100)\r\n                return Task.FromException&lt;bool&gt;(new TutarException());\r\n            else\r\n            {\r\n                if (Tutar &gt;= 100 &amp;&amp; Tutar &lt; 200)\r\n                    return Task.FromResult(false);\r\n                else\r\n                    return Task.Run&lt;bool&gt;(() =&gt;\r\n                     {\r\n                         while (true)\r\n                         {\r\n                             if (DateTime.Now.Second == 10)\r\n                             {\r\n                                 Console.WriteLine(&quot;\u00d6deme yap\u0131ld\u0131.&quot;);\r\n                                 return true;\r\n                             }\r\n                         }\r\n                     });\r\n            }\r\n        }\r\n    }\r\n\r\n    class TutarException : Exception\r\n    {\r\n        public TutarException() : base(&quot;\u00d6deme tutar\u0131 100 TL'den a\u015fa\u011f\u0131 olamaz.&quot;)\r\n        {\r\n\r\n        }\r\n    }\r\n<\/pre>\n<p>G\u00f6rd\u00fcld\u00fc\u011f\u00fc \u00fczere &#8220;Odeme&#8221; s\u0131n\u0131f\u0131 i\u00e7erisinde &#8220;Tahsilat&#8221; metodu yap\u0131lacak tutar\u0131n &#8220;100&#8221; de\u011ferinden az oldu\u011fu durumda direkt metoddan \u00e7\u0131kmaktad\u0131r. E\u011fer ki, &#8220;100&#8221; ile &#8220;200&#8221; de\u011ferleri aras\u0131nda bir mebla\u011fda \u00f6deme ger\u00e7ekle\u015ftiriliyorsa gene senkron bir \u015fekilde &#8220;false&#8221; de\u011feri geriye d\u00f6nd\u00fcr\u00fclmektedir. E\u011fer ki, \u00f6denen tutar &#8220;200&#8221; de\u011ferinden fazla ise Task.Run metoduyla asenkron bir \u015fekilde \u00e7al\u0131\u015fma ba\u015flat\u0131lmakta ve 10. saniyede \u00f6deme ger\u00e7ekle\u015ftirilmektedir.<\/p>\n<h3>.NET 4.6.1 Versiyonunda Gelen Task.FromResult Benzeri Di\u011fer Yap\u0131lar<\/h3>\n<p>.NET 4.6.1 versiyonunda Task.FromResult mant\u0131\u011f\u0131nda bir \u00e7ok metod ve property yap\u0131lar\u0131 gelmi\u015ftir. Son olarak bu yap\u0131lar \u00fczerinde konu\u015farak makalemizi noktalayal\u0131m.<\/p>\n<ul>\n<li>\n<strong>Task.FromException<\/strong><br \/>\nFromException metodu, yap\u0131lan asenkron i\u015flemlerde bir aksakl\u0131k olu\u015ftu\u011fu durumlarda Task tipini olu\u015fturmakta ve geriye bir Exception f\u0131rlatmaktad\u0131r.<\/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            OrnekClass oc = new OrnekClass();\r\n            oc.MetodCalistir();\r\n            Console.Read();\r\n        }\r\n    }\r\n\r\n    class OrnekClass\r\n    {\r\n        public async void MetodCalistir()\r\n        {\r\n            await Metod();\r\n        }\r\n        Task&lt;int&gt; Metod()\r\n        {\r\n            return Task.FromException&lt;int&gt;(new OrnekException());\r\n        }\r\n    }\r\n\r\n    class OrnekException : Exception\r\n    {\r\n        public OrnekException() : base(&quot;Bu bir \u00f6rnek Exception'd\u0131r.&quot;)\r\n        {\r\n\r\n        }\r\n    }\r\n<\/pre>\n<p>G\u00f6r\u00fcld\u00fc\u011f\u00fc \u00fczere &#8220;OrnekException&#8221; isimli Exception&#8217;\u0131m\u0131z\u0131 &#8220;OrnekClass&#8221; s\u0131n\u0131f\u0131 i\u00e7erisindeki &#8220;Metod&#8221; isimli metotda Task.FromException ile d\u00f6nd\u00fcrmekteyiz. Ayn\u0131 s\u0131n\u0131f i\u00e7erisinde bulunan &#8220;MetodCalistir&#8221; isimli metotla asenkron bir \u015fekilde \u00e7al\u0131\u015ft\u0131rmaktay\u0131z. &#8220;Main&#8221; metodunda ise ilgili yap\u0131y\u0131 \u00e7a\u011f\u0131rd\u0131\u011f\u0131m\u0131z zaman a\u015fa\u011f\u0131daki sonu\u00e7la kar\u015f\u0131la\u015fmaktay\u0131z.<br \/>\n<a href=\"http:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2016\/12\/Cta-Task.FromResult-Metodu-2.png\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2016\/12\/Cta-Task.FromResult-Metodu-2.png\" alt=\"C#&#039;ta Task.FromResult Metodu\" width=\"483\" height=\"122\" class=\"aligncenter size-full wp-image-5514\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2016\/12\/Cta-Task.FromResult-Metodu-2.png 483w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2016\/12\/Cta-Task.FromResult-Metodu-2-300x76.png 300w\" sizes=\"auto, (max-width: 483px) 100vw, 483px\" \/><\/a>\n<\/li>\n<li>\n<strong>Task.FromCanceled<\/strong><br \/>\nBir g\u00f6rev iptal edildi\u011fi zaman exception olarak geri d\u00f6nen metotdur. Kullan\u0131m\u0131 a\u015fa\u011f\u0131daki gibidir.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n        Task&lt;bool&gt; AracGonder()\r\n        {\r\n            CancellationToken token = new CancellationToken(true);\r\n            \/\/token nesnesi sayesinde g\u00f6revin iptal edildi\u011fini belirtiyoruz.\r\n            if (token.IsCancellationRequested)\r\n                \/\/IsCancellationRequested \u00f6zelli\u011fi g\u00f6rev iptalse true d\u00f6necektir.\r\n                return Task.FromCanceled&lt;bool&gt;(token);\r\n            \/\/token nesnesi g\u00f6revin iptal oldu\u011funu ta\u015f\u0131d\u0131\u011f\u0131ndan Task.FromCanceled metodunu return edebiliyoruz.\r\n            else\r\n                return Task.FromResult(true);\r\n        }\r\n<\/pre>\n<\/li>\n<li>\n<strong>Task.CompletedTask<\/strong><br \/>\nTask.CompletedTask propertysi ise generic olmayan tamamlanm\u0131\u015f bir Task tipi d\u00f6nmemizi sa\u011flamaktad\u0131r. Yani a\u015fa\u011f\u0131daki \u00f6rnekte oldu\u011fu gibi;<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n        Task OrnekMetod()\r\n        {\r\n            return Task.CompletedTask;\r\n        }\r\n<\/pre>\n<\/li>\n<\/ul>\n<p>Evet&#8230; Task s\u0131n\u0131f\u0131 \u00fczerinde static olarak ayarlanm\u0131\u015f yap\u0131lardan etkili olanlar\u0131 detayl\u0131ca irdeledi\u011fimizi san\u0131yorum. Bundan sonra olu\u015fturulacak g\u00f6revlerde l\u00fczumsuz nesne ve i\u015flev kalabal\u0131\u011f\u0131ndan ka\u00e7\u0131narak bu yap\u0131lar\u0131n kullan\u0131lmas\u0131na dikkat etmenizi tavsiye ederim.<\/p>\n<p>Sonraki yaz\u0131lar\u0131mda g\u00f6r\u00fc\u015fmek \u00fczere&#8230;<br \/>\n\u015eimdilik ho\u015f\u00e7akal\u0131n&#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, Programlama yap\u0131lar\u0131 \u00fczerine \u00e7al\u0131\u015fmalar\u0131n yan\u0131nda harici yaz\u0131l\u0131-g\u00f6rsel materyaller \u00fczerinden de genel kamuoyu takibimede devam etmekteyim. Haliyle ge\u00e7enlerde oturmu\u015f \u015f\u00f6yle blogda\u015flar \u00fczerinde bir g\u00f6z gezdirmekteyken Syn. \u0130lkay \u0130lknur hocam\u0131z\u0131n adreste verdi\u011fim makalesinde basit ama&#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,1490],"tags":[579,1233,1234,1585,1587,1582,1584,1579,1394,1558,1586,1581,1583,1577,1578,1580],"class_list":["post-5492","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-c-sharp-c","category-c-7-0","tag-asenkron","tag-async","tag-await","tag-cancellationtoken","tag-completedtask","tag-fromcanceled","tag-fromexception","tag-fromresult","tag-senkron","tag-task","tag-task-completedtask","tag-task-fromcanceled","tag-task-fromexception","tag-task-fromresult","tag-task-fromresult-metodu","tag-task-run"],"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/5492","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=5492"}],"version-history":[{"count":0,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/5492\/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=5492"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/categories?post=5492"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/tags?post=5492"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}