Konuyu görüntüle
IUCODERS FORUM > Programlama > .NET > asp.net timer: bazen tetiklenmiyor.
Yazar
melanko


avatar

Kayıt: 05.12.2006
08.05.2008-11:34 #44242
Merhaba arkadaşlar,

Timer dakikada bir tetikleniyor. 15 dkda bir bir işlem yapıyor.
Sorun timerın bazen tetiklenmemesi. Kodlar aşağıda yorumlarınızı bekliyorum.
private System.Threading.Timer timer;
private int interval = 60 * 1000;

 void Application_Start(object sender, EventArgs e) 
    {
          if (timer == null)
           {
                timer = new System.Threading.Timer(new System.Threading.TimerCallback(ScheduledWorkCallback), HttpContext.Current, interval, interval);
                ScheduledWorkCallback(HttpContext.Current);
            }
    }
 void ScheduledWorkCallback(object sender)
    {
           if(DateTime.Now.Minute == 15)
                //do something
     }

Kolay gelsin.





Öylesine inand?rm??t?m ki seni dünayadaki son a?kla sevdi?ime...
Yazar
tarikkranda


avatar

Kayıt: 07.01.2006
08.05.2008-12:42 #44243
Threading namespace i altindaki Timer sınıfını kullanmak yerine Timers isimuzayındakini denediniz mi? Neden tetiklenmedigi hakkinda bir fikrim yok. Ancak tam 60 saniyede derken ufak bir gecikme ile bile 15. dakikayi kacirabilirsiniz. Sonucta windows isletim sistemi real-time bir isletim sistemi degildir. 2-3 sn lik gecikmeler ile saat (saat.dakika.saniye olarak) 10.14.59 da tetiklenmis bir timer sadece 1ya da 2 sn lik bir gecikme ile bir daha 10.16.00 da tetiklenebilir boylece sizin yapacaginiz is bir sonraki sansini yakalamak icin bir 15 dk daha bekleyecektir. Mission critic bir uygulama icin yazdiginiz kod biraz yetersiz kaliyor. Bunun icin autoresetevent sınıfından yararlanabilirsiniz. Ya da bence bir flag kullanin ve bu birkac saniyelik sapmalarida siz yonetin. Yani == 15 yerine > 14 ya da < 16 seklinde yazin ve arada bir flag ile tetiklendiyse true ya set edin, eger ture ise tetiklemeyin flag i false a cekin.

Bunun haricinde Timers namespace i altindalki kullanim su sekilde.

    private System.Timers.Timer timer;
    private int interval = 60 * 1000;

    void Application_Start(object sender, EventArgs e)
    {
        if (timer == null)
        {
            timer = new System.Timers.Timer();
            timer.Elapsed += new System.Timers.ElapsedEventHandler(ScheduledWorkCallback);
            timer.Interval = interval;
            timer.Enabled = true;
        }

    }

    void ScheduledWorkCallback(object source, System.Timers.ElapsedEventArgs e)  
    {  
        int a;
        if (DateTime.Now.Minute == 15)
            a = 1;
    }


Kolay gelsin.

Bu arada aklima simdi geldi, application sinifiniz default 20 min. request gelmezse öldürülüyor ve dispose ediliyor. Sizin timer inizin calisiyor olmasi ölmesine engel olur mu bilemiyorum su anda ama ölmemesi gerekiyorsa bu durumuda göz önüne almanızda yarar var.





Yazar
timur


avatar
İstanbul
Kayıt: 19.01.2006
08.05.2008-12:56 #44244
Tarık hocam yanlışınız olmasın, Application nesnesi 20 dakikada ölmez diye biliyorum. Session'lar süresi dolunca ölüyor fakat Application nesnesi ölmez diye biliyorum.

Sorunun çözümüne ilişkin şunu söyleyebilirim, timer her işlem yaptığında bir log tutarsanız, örneğin bir dosyaya her çalıştığı saati yazabilirsiniz, ya da işlemin neden gerçekleşmediğine ilişkin bir yazı, kodunuzun neden çalışmadığına ilişkin bir fikriniz olur. Acaba timer mı tetiklenmiyor, yoksa tetiklendiğinde çalıştırdığınız kodda mı bir hata var?

Kolay gelsin...





Hayat varsa umut vard?r...
www.timureroglu.com

Yazar
tarikkranda


avatar

Kayıt: 07.01.2006
08.05.2008-20:52 #44257
timur yazdi
 
Tarık hocam yanlışınız olmasın, Application nesnesi 20 dakikada ölmez diye biliyorum. Session'lar süresi dolunca ölüyor fakat Application nesnesi ölmez diye biliyorum.

Sorunun çözümüne ilişkin şunu söyleyebilirim, timer her işlem yaptığında bir log tutarsanız, örneğin bir dosyaya her çalıştığı saati yazabilirsiniz, ya da işlemin neden gerçekleşmediğine ilişkin bir yazı, kodunuzun neden çalışmadığına ilişkin bir fikriniz olur. Acaba timer mı tetiklenmiyor, yoksa tetiklendiğinde çalıştırdığınız kodda mı bir hata var?

Kolay gelsin...


Yanlışım yok Timur, dediğim gibi bu verdiğim süre 20 dakikadan farklı olabilir ama bahsettiğim gibi shared server ların daha fazla kişiye hizmet vermesi amacıyla böyle bir process modeli söz konusu ASP.NET in yapısında. Bahsettiğin gibi sessionlar için web.config deki sessionState timeout niteligi bu degeri tasiyor. Ancak ben ondan değil application domainleri host eden Application nesnesinin kapanıp yeniden açılmasından bahsediyorum. technet teki şu linkte bahsettiğiö olayı buldum. Idle kalan sistemler process çizelgesinden çekilir. ASP.NET için bir optimizasyon kuralıdır bu.

http://technet2.microsoft.com/windowsserver/tr/library/6ab0da3f-643b-4859-8f5b-dffcc50b3d161055.mspx?mfr=true

Bunun haricinde zaten Application son bulmasaydi global.asax içinde Application_End eventi ne zaman tetiklenebilirdi ki? Hmm bu konuda aslında ASP.NET uygulaması sadece timeout durumunda değil, örneğin web.config in, global.asax dosyasının vs. manuel olarak değiştirilmesi sonucuda restart ediliyor. O zaman da Application_End eventi tetiklenirdi. Neyse sonuç olarak böyle bir idle süresi mevcut aspnet uygulamaları için, benim bildiğim kadarıyla.





Yazar
timur


avatar
İstanbul
Kayıt: 19.01.2006
09.05.2008-22:37 #44302
tarikkranda yazdi
 
timur yazdi
 
Tarık hocam yanlışınız olmasın, Application nesnesi 20 dakikada ölmez diye biliyorum. Session'lar süresi dolunca ölüyor fakat Application nesnesi ölmez diye biliyorum.

Sorunun çözümüne ilişkin şunu söyleyebilirim, timer her işlem yaptığında bir log tutarsanız, örneğin bir dosyaya her çalıştığı saati yazabilirsiniz, ya da işlemin neden gerçekleşmediğine ilişkin bir yazı, kodunuzun neden çalışmadığına ilişkin bir fikriniz olur. Acaba timer mı tetiklenmiyor, yoksa tetiklendiğinde çalıştırdığınız kodda mı bir hata var?

Kolay gelsin...


Yanlışım yok Timur, dediğim gibi bu verdiğim süre 20 dakikadan farklı olabilir ama bahsettiğim gibi shared server ların daha fazla kişiye hizmet vermesi amacıyla böyle bir process modeli söz konusu ASP.NET in yapısında. Bahsettiğin gibi sessionlar için web.config deki sessionState timeout niteligi bu degeri tasiyor. Ancak ben ondan değil application domainleri host eden Application nesnesinin kapanıp yeniden açılmasından bahsediyorum. technet teki şu linkte bahsettiğiö olayı buldum. Idle kalan sistemler process çizelgesinden çekilir. ASP.NET için bir optimizasyon kuralıdır bu.

http://technet2.microsoft.com/windowsserver/tr/library/6ab0da3f-643b-4859-8f5b-dffcc50b3d161055.mspx?mfr=true

Bunun haricinde zaten Application son bulmasaydi global.asax içinde Application_End eventi ne zaman tetiklenebilirdi ki? Hmm bu konuda aslında ASP.NET uygulaması sadece timeout durumunda değil, örneğin web.config in, global.asax dosyasının vs. manuel olarak değiştirilmesi sonucuda restart ediliyor. O zaman da Application_End eventi tetiklenirdi. Neyse sonuç olarak böyle bir idle süresi mevcut aspnet uygulamaları için, benim bildiğim kadarıyla.


Açıklama için teşekkürler hocam. Global.asax, web config değiştiğinde ve IIS restart olduğunda son bulduğunu biliyordum, bunu da öğrenmiş olduk...





Hayat varsa umut vard?r...
www.timureroglu.com

Del.icio.us
Digg
Facebook
Furl
Google
Blink
Simpy
Spurl
Y! MyWeb