none
Timer ve FileSystemWatcher kullanımı RRS feed

  • Soru

  • Merhaba Arkadaşlar,

    FileSystemWatcher ile dosya dinletip belirli bir süre sonra timer çalıştırıyorum FileSystemWatcher ve timer başlatılmasında sorun yok fakat OnTimerEvent içerisinde time ı  timer.stop yaptık dan sonra  ve dosya içerisinde değişiklik yapıp event tetiklendiğinde timer ı  tekrar start olmuyor unuttuğum bir şey mi var acaba.

     FileSystemWatcher fsw()
            {
                FileSystemWatcher fw = new FileSystemWatcher();
                if (Settings.Instance.GetValue(Information.OtomatikUrunAlimi).ToBoolean())
                {
                    fw = new FileSystemWatcher("c:\\TEST") { EnableRaisingEvents = true, Filter = "*.DAT", IncludeSubdirectories = false };
                }
                return fw;
            }
    
     public void Dinle()
            {
                if (Settings.I
                    fsw().Changed += new FileSystemEventHandler(Degisiklik);
            }
    
    Timer tmr = new Timer()
            {
                Interval = 6000,
                Enabled = true
            };
    
     public void Degisiklik(object sender, FileSystemEventArgs e)
            {
                    PathName = e.FullPath;
                    FileName = e.Name;
                    count = 0;
    
                    tmr.Tick += new EventHandler(OnTimerEvent);
                    tmr.Start();
                
            }
    
    private void OnTimerEvent(object sender, EventArgs e)
            {
                Mesaggebox.MsgBox("Ok");
                tmr.Stop();
            }


    • Düzenleyen csharpp 30 Haziran 2016 Perşembe 07:37
    30 Haziran 2016 Perşembe 07:37

Yanıtlar

  • 1. tmr.Enabled = true; kullan.

    2. Degisilik isimli methodundaki tmr.Tick += li satırı kaldır. Böyle yaparsan o methodu tekrar tekrar eklemiş olursun. Bu durumda her tick de OnTimerEvent methodu defalarca çalışır. Bu method bağlama işini sadece 1 kere yap.

    3. Amacın değişiklikten 6sn sonra iş yapmak ise Timer yerine  await Task.Delay(6000)  gibi kullanım daha iyi olacaktır.

    30 Haziran 2016 Perşembe 08:35

Tüm Yanıtlar

  • 1. tmr.Enabled = true; kullan.

    2. Degisilik isimli methodundaki tmr.Tick += li satırı kaldır. Böyle yaparsan o methodu tekrar tekrar eklemiş olursun. Bu durumda her tick de OnTimerEvent methodu defalarca çalışır. Bu method bağlama işini sadece 1 kere yap.

    3. Amacın değişiklikten 6sn sonra iş yapmak ise Timer yerine  await Task.Delay(6000)  gibi kullanım daha iyi olacaktır.

    30 Haziran 2016 Perşembe 08:35
  • Cihan abi teşekkür ederim abim, yalnız şöyle bir sorun oldu bu Delay metodu neden çıkmaz bende abi
    30 Haziran 2016 Perşembe 10:14
  • Framework versiyonun eskidir. Ya da

    using System.Threading.Tasks;

    eklememişsindir.

    30 Haziran 2016 Perşembe 10:40
  • Framweork 4.5 de çalıştı abi peki Cihan abi öğrenmek için soruyourm timer dan daha mı hızlı bu acaba.
    30 Haziran 2016 Perşembe 12:44
  • Framweork 4.5 de çalıştı abi peki Cihan abi öğrenmek için soruyourm timer dan daha mı hızlı bu acaba.

    evet, daha hızlı, o 4.5 sayısı ordan geliyor zaten, 6 saniyeyi 4.5 saniyede alıyor.

    tam sopalıksınız


    e-mail: onay[nokta]yalciner[at]hotmail[nokta]com


    30 Haziran 2016 Perşembe 13:36
  • Daha yavaş olsa 6000 değil 5000 yazarsın :)... Mesele hız meselesi değil. Senin amacın uygulamayı geciktirmek. Öyleyse timer gibi periyodik iş yapma amacı olan bir nesne yerine asıl amacı bekleme olan bir şey kullanman daha uygun düşer. Gereksiz yere bellekte timer oluşturmanın anlamı yok. async/await ise bu bekleme sırasında arayüzünün kilitlenmemesi için. 

    Frameworkler arası hız farkında gelince @Önay 'a tamamen katılıyorum.


    30 Haziran 2016 Perşembe 15:17
  • Cevaplarınız için çok teşekkür ederim.
    11 Temmuz 2016 Pazartesi 08:25