Quartz.Net kullanarak .Net Core projelerinde zamanlanmış görevler yapmak

Eğer geliştirdiğiniz .Net Core projelerinde zamanlanmış görevler çalıştırmaya ihtiyaç duyarsanız, Quartz.Net kütüphanesinden faydalanabilirsiniz.

Bu makalede Quartz.Net kütüphanesini .Net Core ile geliştireceğimiz bir Console uygulamasında kullanacağız.

Hemen Visual Studio 2017 açalım ve yeni bir Console App (.Net Core) projesi oluşturalım;

Şimdi projenin Dependencies kısmına sağ tuşla tıklayıp Manage Nuget Packages… menüsünü seçelim, açılan pencerede Quartz paketini aratalım ve projeye ekleyelim. (Ben bu yazıyı yazarken v3.0.0-alpha2 .Net Core destekliyordu)

Program.cs dosyasını açalım ve Main() methodu içerisini aşağıdaki gibi değiştirelim;

InitializeJob() methodu içerisinde öncelikle StdSchedulerFactory sınıfından yeni bir instance çıkartıp, GetScheduler() methodunu çağırıyor, IScheduler interface‘inde yeralan Start() methodu ile başlatıyoruz.

JobBuilder sınıfının önce Create() methodunu, sonra Build() methodunu çağırıyoruz.

TriggerBuilder sınıfının da önce Create() methodunu, sonra StartNow() methodunu çağırarak hemen çalıştırmaya başlayacağımızı, WithCronSchedule() mthodunu çağırarak hangi periyotta çalıştırmak istediğimizi belirtiyoruz, en sonunda Build() methodunu çağırmayı unutmuyoruz.

WithCronSchedule() methoduna parametre verebileceğimiz değerler için CronExpressionGenerator sayfasını kullanabiliriz.

Ben bu makalede * * * ? * * ile her saniye tetiklenecek bir zamanlayıcı görev tanımladım.

IScheduler interface’inin ScheduleJob() methodu ile Job ve Trigger aracılığı ile zamanlanmış görevi başlatıyoruz.

Son olarak projeye aşağıdaki sınıfı da ekleyelim;

Uygulamayı çalıştırdığımızda aşağıdaki gibi bir çıktı almamız lazım;

C# Shallow Copy ve Deep Copy arasındaki fark

Bazı durumlarda C# projemizde elimizdeki değişkenin bir kopyasını çıkarmamız gerekir.

Örneğin, ekrandaki fatura‘nın veya müşterinin aynısından oluşturalım ama Adı, Adresi, gibi alanların değerlerini değiştirelim sadece.

Bu tip senaryolarda karşımıza iki seçenek çıkıyor; Basit Kopya (Shallow Copy) ve Derin Kopya (Deep Copy)

Shallow Copy, ilgili değişkenin sadece primitive tiplerdeki özelliklerinin değerlerini kopyalar, custom tiplerdeki özelliklerini kopyalamaz.

Senaryomuzda aşağıdaki sınıflar yer alsın;

Eğer Customer sınıfından bir değişkenin kopyasını çıkartmak istersek, aynı tipte yeni bir değişken oluşturup özelliklerin değerlerini atayabiliriz;

Bir sınıfın çok fazla özelliği olduğu durumda bu yol pek verimli olmayacaktır. Sınıfa eklenecek yeni özellikler (PhoneNumber, Status, vs) için kopyalama yaptığımız her yerde güncelleme yapmamız da gerekecek.

Shallow Copy ile bu sorunu şöyle aşabiliyoruz;

Gördüğünüz gibi Customer sınıfına ShallowCopy() isimli bir method ekledik ve içerisinde this.MemberwiseClon(); methodunu çağırdık, Customer sınıfına dönüştürüp geri döndürdük.

Kullanımı;

Fakat bu senaryoda sadece primitive tiplerin (string, int, bool, vs) yeni değişkene kopyalanmasını sağlayabildik.

Custom tiplerin (Address, ShoppingCart, vs) yeni değişkende değerleri orjinal değişkendeki değerlerin referansları olacaktır.

Yani, kopyaladığımız değişkende bir değişiklik yaparsak orjinal değişkendeki değerde değişir.

Aslında değişmez, iki değerinde hafızadaki adresi aynı olacağı için (referans) birinde değişiklik yapınca diğeri de aynı hafıza alanından değişen değeri okuyacak

Elimizdeki değişkenin tamamen yepyeni bir kopyasını çıkartmak istiyorsak, Deep Copy yöntemlerini kullanmalıyız.

Örneğin;

Kullanım örneği;

Bu durumda newCustomer değişkeni customer değişkeninin birebir kopyası olacak. Herhangi bir değeri değiştirilecek olursa customer değişkeni bundan etkinlenmeyecek.

Öncelikle MemoryStream kullanarak kopyalama için hafızada bir alan oluşturuyoruz, BinaryFormatter ile bu alana elimizdeki değişkeni serilize ediyoruz.

Son olarak aynı alanın başına gidip tekrar Customer sınıfına dönüştürüp geri döndürüyoruz.

Böylece istediğimiz değişkenlerin kopyalarını oluşturabiliriz.

C# Action ve Func Generic sınıfları ne işe yarar?

Bu makalede C# projelerimizde kullandığımız Action<T> ve Func<TParam, TReturn> sınıfları ne işe yarar sorusunun cevabını arayacağız.

En basit anlatımı ile Action<T> ve Func<TParam, TReturn> sınıfları delegate method gibi davranır.

Yani Action<T> veya Func<TParam, TReturn> sınıfından yeni bir değişken oluşturup, değer olarak bir method’un kendisini atayabiliriz.

Böylece değişkeni her tetiklediğimizde aslında değer olarak atadığımız method‘u tetiklemiş oluruz.

Hatta parametreleri uyduğu sürece değişkene atadığımız methodu başka bir method ile de değiştirebiliriz.

Action<T> ve Func<TParam, TReturn> sınıfları parametre alabilirde, almayabilirde. Yani sıfır veya daha fazla parametre alabilirler.

Aralarındaki fark ise, Action<T> geriye değer döndürmez iken, Func<TParam, TReturn> geriye değer döndürür.

Örneğin;

Önemli nokta; Action<T> sınıfından değişkene vereceğiniz method’un aldığı parametreler, Action<T> sınıfının generic parametreleri ile örtüşmeli.

Örneğin;

Ayrıca, Func<TParam, TReturn> sınıfından oluşturduğumuz değişkene atadığımız method’un parametreleri TParam generic parametreleri ile ve dönüş tipi TReturn generic parametresi ile örtüşmeli.

Örneğin;

Xamarin.Forms DevNot Atölye Etkinliği Aralık 2016

24 Aralık 2016 tarihinde DevNot Atölye bünyesinde ITU Ayazağa Kampüsü‘nde Xamarin.Forms ile Cross-Platform Uygulama Geliştirme konusunda bir etkinlik organize ettik.

Etkinliği gerçekleştirmemizi sağlayan sevgili arkadaşım Uğur Umutluoğlu‘na ve etkinliğe katılan tüm arkadaşlara çok teşekkür ederim.

AçıkAkademi Sanayi 4.0 İleri Seviye Eğitimleriyle Akıllı Nesneler (IoT) Dünyasına Giriş Yapmak İstiyorum Eğitimi 2016

AçıkAkademi üzerinde yayınlanan 33 video’luk Sanayi 4.0 İleri Seviye Eğitimleriyle Akıllı Nesneler (IoT) Dünyası eğitim seti yayına alındı.

Sevgili arkadaşlarım Umut Erkal ve Faruk Çelik ile hazırladığımız eğitim setini sizler de Sanayi 4.0 İleri Seviye Eğitimleriyle Akıllı Nesneler (IoT) Dünyasına Giriş Yapmak İstiyorum başlıklı AçıkAkademi sayfasından izleyebilirsiniz. Eğitim konu listesi;

  • Amaç ve Kapsam
  • Nesnelerin İnterneti
  • Raspberry PI 3 Genel Tanıtım
  • Raspberry PI 3
  • IoT Sensor Shield Tanıtımı - 1
  • IoT Sensor Shield Tanıtımı - 2
  • Universal Windows Platform (UWP) nedir?
  • Visual Studio’da Proje Oluşturmak
  • Olaya Dayalı Programlama
  • Değişkenler
  • Sınıflar
  • Fonksiyonlar ve Metotlar
  • Kontrol Yapıları
  • Raspberry PI İçin İlk Uygulamamızı Yazıyoruz - 1
  • Raspberry PI İçin İlk Uygulamamızı Yazıyoruz - 2
  • Raspberry PI İçin İlk Uygulamamızı Yazıyoruz - 3
  • Sıcaklık - Nem Sensöründen Veri Okuma Uygulaması
  • IoT HAT’imizle Çiçek Suluyoruz - 1
  • IoT HAT’imizle Çiçek Suluyoruz - 2
  • Sıcaklık Değişimine Göre Çiçek Sulama Uygulaması
  • Bulut Bilişim ve Microsoft Azure
  • Microsoft Azure Hesabımızı Açıyoruz
  • Microsoft Azure’daki IoT Projelerimiz için Kullanacağımız Hizmetler
  • Power BI ve Verilerimizin Görselleştirilmesi
  • Ücretsiz Bir Power BI Hesabı Açıyoruz
  • Power BI’a Göz Atalım
  • Örnek IoT Projemiz
  • Azure Hesabımızda IoT Hub Oluşturalım ve Gerekli Bilgileri Not Edelim
  • Azure Stream Analytics Hizmetimizi Oluşturalım
  • Azure Storage Hesabı Hizmetimizi Oluşturalım ve Container Yaratalım
  • RPI3’te Çalışacak UWP Uygulamamızı Yazalım - 1
  • RPI3’te Çalışacak UWP Uygulamamızı Yazalım - 2
  • RPI3’te Çalışacak UWP Uygulamamızı Yazalım - 3

AçıkAkademi için bu eğitim setini çekmemizi sağlayan sevgili arkadaşım Ümit Batu‘ya da teşekkür ederim.

Engin Polat hakkında

Chief Architect, Microsoft RD, Microsoft MVP

Ada ve Ege'nin babası ;)

Kategoriler

İstatistik

Makale Adedi: 458

Creative Commons Lisansı