Yazılım Mimarileri ve Tasarım Desenleri Üzerine

C#’ta Task.FromResult Metodu

Merhaba,

Programlama yapıları üzerine çalışmaların yanında harici yazılı-görsel materyaller üzerinden de genel kamuoyu takibimede devam etmekteyim. Haliyle geçenlerde oturmuş şöyle blogdaşlar üzerinde bir göz gezdirmekteyken Syn. İlkay İlknur hocamızın adreste verdiğim makalesinde basit ama oldukça etkili bir konuyla karşılaştım. Birazdan bizimde detaylandıracağımız bu konuda İlkay Hocamız benimde farklı yaklaşımlar sergilediğim bir duruma Task.FromResult metodunu tanımlayarak çözüm üretmemizi tavsiye etmektedir. Şimdi gelin; hangi durumda, ne amaçla Task.FromResult metodunu kullanacağımızı inceleyelim.

Biliyoruz ki, Task sınıfı herhangi bir asenkron operasyonun çalışma sürecindeki tüm bilgilerini tutan bir sınıftır. Haliyle async ve await komutları Task tipinden faydalanarak gereken yapıları oluşturmakta ve sürecin asenkron bir şekilde ilerlemesini sağlamaktadırlar.

Şimdi konumuzun derinliklerine yavaş yavaş girelim. Öncelikle aşağıdaki kod bloğunu inceleyiniz.

        static Task<int> OrnekMetod()
        {
            ...
        }

Yukarıda görmüş olduğunuz metod Task<int> tipinde geri dönüş değerine sahip bir metoddur. Bu metodun çalışabilmesi için Task<int> tipinde bir değeri geriye döndürmesi gerekmektedir. Bu gereksinimi gidermek için Task tipine özel üç farklı durumu aşağıdaki gibi göz önüne alalım;

Bazı Durumlarda Senkron, Bazı Durumlarda ASenkron Metod

Bu işlem için aşağıdaki kod bloğunu inceleyiniz.

    class Odeme
    {
        public async void TahsilatYap(double Tutar)
        {
            try
            {
                var Sonuc = await Tahsilat(Tutar);
                Console.WriteLine(Sonuc);
            }
            catch (Exception e)
            {
                Console.WriteLine(e.Message);
            }
        }
        Task<bool> Tahsilat(double Tutar)
        {
            if (Tutar < 100)
                return Task.FromException<bool>(new TutarException());
            else
            {
                if (Tutar >= 100 && Tutar < 200)
                    return Task.FromResult(false);
                else
                    return Task.Run<bool>(() =>
                     {
                         while (true)
                         {
                             if (DateTime.Now.Second == 10)
                             {
                                 Console.WriteLine("Ödeme yapıldı.");
                                 return true;
                             }
                         }
                     });
            }
        }
    }

    class TutarException : Exception
    {
        public TutarException() : base("Ödeme tutarı 100 TL'den aşağı olamaz.")
        {

        }
    }

Gördüldüğü üzere “Odeme” sınıfı içerisinde “Tahsilat” metodu yapılacak tutarın “100” değerinden az olduğu durumda direkt metoddan çıkmaktadır. Eğer ki, “100” ile “200” değerleri arasında bir meblağda ödeme gerçekleştiriliyorsa gene senkron bir şekilde “false” değeri geriye döndürülmektedir. Eğer ki, ödenen tutar “200” değerinden fazla ise Task.Run metoduyla asenkron bir şekilde çalışma başlatılmakta ve 10. saniyede ödeme gerçekleştirilmektedir.

.NET 4.6.1 Versiyonunda Gelen Task.FromResult Benzeri Diğer Yapılar

.NET 4.6.1 versiyonunda Task.FromResult mantığında bir çok metod ve property yapıları gelmiştir. Son olarak bu yapılar üzerinde konuşarak makalemizi noktalayalım.

Evet… Task sınıfı üzerinde static olarak ayarlanmış yapılardan etkili olanları detaylıca irdelediğimizi sanıyorum. Bundan sonra oluşturulacak görevlerde lüzumsuz nesne ve işlev kalabalığından kaçınarak bu yapıların kullanılmasına dikkat etmenizi tavsiye ederim.

Sonraki yazılarımda görüşmek üzere…
Şimdilik hoşçakalın…
İyi çalışmalar…

Mobil sürümden çık