C# ile Zamanlayıcı Kullanmak (System.Timers)

Windows programlama ile uğraşanlar Timer kontrolünü sık sık kullanmışlardır. Bu yazıda System.Timers isim alanında bulunan Timer sınıfı ile bir programdaki rutin olarak yapılması gereken işleri belirli bir zaman aralığı içinde ne şekilde yapabileceğimizi öğreneceğiz. Ancak alışalıgelmiş şekilde bir grafik arayüzü olan program yerine uygulamamızı komut satırından çalışacak şekilde geliştireceğiz. Burdaki amacımız zamanlayıcı dediğimiz timer nesnelerinin çalışma prensibini yakından görmektir.

Şöyle bir konsol uygulaması yapmanız gerektiğini düşünün. Her 5 dakikada bir, belirli bir kaynaktaki değişiklikler kontrol edilecek. Eğer kaynakta bir değişiklik varsa kullanıcıya uyarı verilecek. Bunu klasik yöntemlerle ne şekilde yapabilirdiniz bir düşünün? Yada ben söyliyeyim. Muhtemelen sonsuz bir döngü içerisinde sistem saatini kontrol edip belirli bir aralık geçmiş ise kaynağı kontrol eden işlevi çağıracaktınız. Eğer zamansal bir işlem yapıyorsak ki bir olayı bir zaman dilimi içinde sürekli gerçekleştirmek zamana bağlı bir olaydır; mutlaka sistem saatinden faydalanmamız gerekir. Sistem saatini makine düzeyinde işleyen bir birim olarak düşünebilirsiniz. Bilgisayar bilimlerinde bir çok algoritma sistem saati üzerine kurulmuştur. Zatan eğer zamanı ölçebilecek bir birim olmasaydı şu anki teknolojik imkanlara kavuşmamız mümkün olamazdı. Sonuç olarak zaman ne kadar değerliyse zamanı ölçebilmek te o derece önemlidir.

Bu yazıda bir metodu bir zaman dilimi içerisinde tekrar tekrar çağırmayı öğreneceğiz. Bunun için System.Timers isim alanında ki Timer isimli sınıfı kullanacağız. Timer sınıfında bulunan Elapsed olayı timer nesnesinin Interval özelliği ile belirlenen aralıkta çalıştırılacak metodun referansını tutmaktadır. Metodun referansı Timer sınıfının içindeki delegate(temsilci) ve olay(event) veri yapıları ile sağlanmaktadır. (Delegate ve Event veri yapıları ile ilgili ayrıntılı yazılar ileriki zamanlarda yayınlanacaktır.)

Şimdi isterseniz Timer sınıfının yapıcı metotlarını inceleyelim.Timer sınıfının iki tane yapıcı metodu vardır. Bu metotlardan birincisi herhangi bir parametre almamaktadır. İkincisi ise double türden bir parametre almaktadır. Double türden olan bu parametre Timer nesnesinin Elapsed olayının ne kadar sürede meydana geleceğini belirtmektedir. Bu metodun prototipi aşağıdaki gibidir.

public Timer(double TickSayısı)

TickSayisi milisaniye cinsindendir. Örneğin her 1 saniyede çalışmasını istediğimiz bir metot için TickSayisi 1000 olan bir Timer kullanmamız gerekir. Saniyede on defa çalışmasını istediğimiz bir metot için ise TickSayisi 100 olan bir Timer nesnesi kullanmalıyız. Eğer yapıcı metot herhangi bir parametre ile kullanılmaz ise varsayılan TickSayisi olan 100 ile Timer nesnesi oluşturulur.

Çalışma zamanında timer nesnelerinin TickSayisini değiştirmek yada Tick sayısını öğrenmek için Interval özelliği kullanılabilir. Timer nesneleri varsayılan olarak aktif değillerdir. Bu yüzden Timer nesnelerinin işleyebilmesi için bool türden olan Enabled özelliğinin true olarak ayarlanması gerekir. Yada Timer sınıfının Start() metodunu kullanarak zamanlayıcıyı başlatmanız gerekmektedir.

Timer sınıfı ile ilgili en önemli nokta Interval ile belirtilen süre dolduğunda hangi metodu çağıracağını nerden anlayacağıdır. Bunun için temsilciler ve olaylar kullanılır. Timer sınıfı tasarlanırken yapısında tanımlanan event ve delegate veri türleri ile bu mümkün olmaktadır. Timer sınıfının Elapsed olayı bu işe yaramaktadır. Elapsed olayına += operatörü ile olay yöneticisi yardımıyla(event handler) yeni metotlar ekleyebiliriz. Timer sınıfının Elapsed olayı için ElapsedEventHandler isminde özel bir temsilci tanımlanmıştır. Bu temsilci nesnesine parametre olarak verilecek metodun parametreik yapısı aşağıdaki gibi olmalıdır.

SaniyelikIs(object o, ElapsedEventArgs a)

ElapsedEventArgs sınıfı Timer nesnesi ile ilgili ayrıntılı bilgiler tutmaktadır. Örneğin ElapsedEventArgs sınıfının SignalTime özelliği ile Elapsed olayının meydana geldiği saati ve tarihi öğrenebiliriz. Örneğimizi verdikten sonra ElapsedEventArgs sınıfını daha iyi öğreneceksiniz.

Timer sınıfının diğer bir önemli elemanı ise Stop() metodudur. Bu metodu çağırdığımız anda Timer nesnesinin Elapsed olayı artık meydana gelmez. Stop() metodu yerine Timer nesnesnin Enabled özelliğini false yapmak ta diğer bir çözümdür.

Timer sınıfı ile ilgili bu bilgileri verikten sonra bir örnek ile bilgilerimizi pekiştirelim. Örneğimiz de her saniye de saati ekrana yazadıracak bir metot bildireceğiz. Bu metot bir Timer sayesinde her saniye çağrılacaktır. Örneğin kaynak kodu aşağıdaki gibidir.

using System;
using System.Timers;

class Zamanlayici
{
static void Main()
{
Timer t = new Timer(1000);
t.Elapsed += new ElapsedEventHandler(SaniyelikIs);
t.Start();

while(true)
{

}
}

static void SaniyelikIs(object o, ElapsedEventArgs a)
{
Console.WriteLine(DateTime.Now);
}
}

Timer sınıfının işlevini görebilmek için programımızın en az beş on saniye çalışmasına devam etmesi gerekir. Bunun için while(true) şeklinde sonsuz bir döngü kurduk. Eğer bu sonsuz döngü olmasaydı programın icrası bir saniyeden kısa bir sürede biteceği için Elapsed olayı meydana gelmeyecekti. Programın çalışması sırasında elde edilmiş bir ekran görüntüsü aşağıdaki gibidir.

Ekran çıktısından da görüldüğü üzere her saniyede ekrana yeni saat değeri yazıldığı için programımız bir saat gibi çalışmaktadır.

SaniyelikIs() metodunu ElapsedEventArgs sınıfından dolayı aşağıdaki gibi de yazabilirdik. ElapsedEventArgs sınıfının SignalTime özelliği Elapsed olayının meydana geldiği zamanı vermektedir.

static void SaniyelikIs(object o, ElapsedEventArgs a)
{
Console.WriteLine(a.SignalTime);
}

Timer sınıfını kullanırken karşılaşabileceğimiz en büyük sorunlardan biri Elapsed olayının meydana gelme aralığının olaydan sonra çalıştırılacak kodların icrası için geçen zamandan az olmasında görülür. Bu sorun, ikinci Elapsed olayı meydana geldiğinde birinci Elapsed olayına ilişkin kodlar halen çalışıyor durumda olmasından kaynaklanır. Örneğimizdeki Timer nesnesinin Tick sayısını 1000 yerine 100 yaptığımızda aynı saat değerinin 10 defa ekrana yazdırılması gerektiğini anlarız. Çünkü Elapsed olayı her saniyede 10 defa gerçekleşecektir. Her 10 Elapsed olayı gerçekleştiğine bir saniye geçeceği için ekrana aynı saat değeri 10 defa yazmalıdır diye düşünürüz. Ama bunun gerçekte böyle olmadığını görürüz. Tick sayısını 100 yaptığımızda programın ekran çıktısı aşağıdaki gibi olmaktadır.

Ekran çıktısında bazı saat değerlerinin daha fazla sayıda bazılarının ise daha az sayıda yazıldığını görüyorsunuz. Bu demek oluyorki programın bellek durumuna ve işlemcinin yoğunluğuna göre Elapsed olayının meydana gelme sayısı değişmektedir. Bunu önlemenin yolu tick sayısının, Elapsed olayından sonra çalışacak metot yada metotların toplam icra süresinde daha fazla olacak şekilde ayarlamaktır.

Elapsed olayına birden fazla metotodu ilişkilendirebiliriz. Örneğin Elapsed olayı her saniyede bir meydana geldiğinde ekrana ayrıca “Merhaba Elapsed olayı!” yazdırmak için aşağıdaki programı yazabilirsiniz.

using System;
using System.Timers;

class Zamanlayici
{
static void Main()
{
Timer t = new Timer(1000);
t.Elapsed += new ElapsedEventHandler(SaniyelikIs);
t.Elapsed += new ElapsedEventHandler(Selam);
t.Start();

while(true)
{

}
}

static void SaniyelikIs(object o, ElapsedEventArgs a)
{
Console.WriteLine(DateTime.Now);
}

static void Selam(object o, ElapsedEventArgs a)
{
Console.WriteLine(“Merhaba Elapsed olayı!”);
}
}

Bu programda Elapsed olayı meydana geldiğinde ilk önce SaniyelikIs() metodu ardından da Selam() metodu çağrılacaktır. Bunun sebebi olayla ilişkilendirilen metotların olay yöneticisine eklenme sırasıdır. İlk eklenen metot ilk çağrılır. Bu programın ekran çıktısı ise aşağıdaki gibi olacaktır.

 

 

SEFER ALGAN’DAN ALINTIDIR

app_offline.htm nedir?

Sıklıkla karşılaşıldığı üzere Asp.net de solution içinde app_offline.htm adında bir dosya oluşup durmaktadır.

Kimi zaman bizim oluşturduğumuz kimi zaman da studionun kendi oluşturduğu bu sayfa, uygulamanın her noktasını erişime kapatır.

Mesela sitede veya veritabanında bir çalışma yapacaksınız ve siteyi kapatmak istiyorsunuz. Eminim ilk aklınıza gelen seçenek Global.ascx oluşturup session start içine kendi oluşturduğunuz bir sayfayı response.redirect edip Çalışma var gibi bişeyler yazmaktır.

app_offline.htm bunu kökten çözüyor işte. Uygulamaya ekleyip çalışma var sonra tekrar deneyin gibi zımbırtılar yazıp bi de fiyakalı tasarım da yaparsanız sitenizin hiçbir noktasına erişim sağlanamaz…

 

İyi Çalışmalar

Ah.Me.T.

NonComVisibleBaseClass was detected

System.InvalidOperationException: Bu türün hiyerarşisinde ComVisible(yanlış) üst öğesi var, bu nedenle IDispatch veya sınıf arabirimleri için QueryInterface çağrılarına izin verilmemektedir. konum: System.Runtime.InteropServices.Marshal.GetNativeVariantForObject(Object obj, IntPtr pDstNativeVariant) konum: System.Data.OleDb.RowBinding.SetVariantValue(Int32 offset, Object value) konum: System.Data.OleDb.ColumnBinding.Value_VARIANT(Object value) konum: System.Data.OleDb.ColumnBinding.Value(Object value) konum: System.Data.OleDb.Bindings.ApplyInputParameters() konum: System.Data.OleDb.OleDbCommand.ExecuteCommandText(Object& executeResult) konum: System.Data.OleDb.OleDbCommand.ExecuteCommand(CommandBehavior behavior, Object& executeResult) konum: System.Data.OleDb.OleDbCommand.ExecuteReaderInternal(CommandBehavior behavior, String method) konum: System.Data.OleDb.OleDbCommand.ExecuteNonQuery() konum: admin_UrunDuzenle.btnKaydet_Click(Object sender, EventArgs e)

Diye alınan hatada parametrelerinizi ve tanımladığınız değerlerin uzantılarını ve dönüşümlerini kontrol ediniz.

Örneğin “.Text” yazılacağı yerde yanlışlıkla “.TemplateControl” yazdıysanız try catch bloğunun üstünden atlayıp programınız kırılacaktır. MSDN ve diğer sitelerde aşmak için attribute tanımlamayı ya da build yapılırken debug yerine relise yapılmasını önerir fakat bunu server üstünde çalıştırdığınızda aynı hatayı almaya devam edebilirsiniz.

Crud işlemleri gibi basit işlmelerde bu hatayla karşılaşıyorsanız kesinlikle parametrelerinizi ve dönüşümlerinizi kontrol ediniz.

 

İyi Çalışmalar Ah.Me.T.

Destek Böyle Yapılır!

Şöyle bi e-ticaret sitesini ya da satış-stok-muhasebe programını ayrıntılı ayrıntılı, yüzeysel olmadan, gerçekten bi firmanın kullanacağı haliyle anlatan bi site olsa; video serisi halinde gitse; makalelerle beslense; üstüne bi de uygulamaları indirebileceğimiz kaynağımız olsa bi köşede diyenlerrrr 🙂

Buyrun şöyle içeri… 🙂

Sabırsızlanıyorum hemen bitsin yayınlayayım diye çünkü sizlere 3 uygulama sunacağım.

1 – Satış-Stok-Muhasebe Sistemi

2 – E-Ticaret Sitesi

3 – Saha Yönetim Sistemi

Bunları adım adım videolar ve makaleler halinde sizlere sunacağım….

İlk Yazı

Bloğumu açtım ve artık kodlarımı ve vebinerlerimi bu adresten sizlere ulaştıracağım.
Herkese kolaygelsin…..