2011-05-25 12 views
7

System.Threading.Timer'deki aralığı bu zamanlayıcının geriçağırım işlevinden nasıl değiştiririm? Bu doğru mu?System.Threading.Timer'deki aralık süresini bu zamanlayıcının geriçağırım işlevinden nasıl değiştiririm?

Böyle yapıyor. Olmadı. TimerCallBack hemen yürütmek için

if(true) 
    _timer.Change(TimeSpan.Zero, TimeSpan.FromMinutes(10)); 

İlk parametre kuvvetlerini:

public class TestTimer 
{ 
    private static Timer _timer = new Timer(TimerCallBack); 

    public void Run() 
    { 
     _timer.Change(TimeSpan.Zero, TimeSpan.FromMinutes(1)); 
    } 

    private static void TimerCallBack(object obj) 
    { 
     if(true) 
      _timer.Change(TimeSpan.Zero, TimeSpan.FromMinutes(10)); 
    } 

} 
+2

(true) ??? ......... –

+1

@Mitch Buğday, örneğin iyi bir nedenden dolayı geçerli midir? – crypted

+1

Mitch, bu sadece bir örnek. Ciddiye alma. – mrbrooks

cevap

8

Bu hat sonsuz özyinelemeye üretir. Böylece tekrar ve tekrar tekrar yürütür.

düzeltme

if(true) 
    _timer.Change(TimeSpan.FromMinutes(10), TimeSpan.FromMinutes(10)); 
+0

Çok teşekkür ederim! – mrbrooks

4

sorun Change için çağrı sonraki çağrı derhalgerçekleşmesi gerektiğini belirten olmasıdır olurdu. Changeher numaralı telefonu arayacaksanız, Timeout.Infinite (sadece -1'in bir sabitidir) periyodunu bir sonraki seferden sonra tekrar etmekten kaçınmak için kullanabilirsiniz - ama yine de ateşlemeye devam edecektir. Çünkü bir dahaki sefere, sıfırla. Alternatif olarak

using System; 
using System.Threading; 

static class Program 
{ 
    private static Timer timer = new Timer(TimerCallBack); 

    public static void Main() 
    { 
     timer.Change(TimeSpan.Zero, TimeSpan.FromSeconds(1)); 
     Thread.Sleep(10000); 

    } 

    private static void TimerCallBack(object obj) 
    { 
     Console.WriteLine("{0}: Fired", DateTime.Now); 
     timer.Change(TimeSpan.FromSeconds(3), 
        TimeSpan.FromMilliseconds(Timeout.Infinite)); 
    } 
} 

, sadece bir kez değiştirmek ve sonra bırakmak olabilir: her iki durumda da bir şey başlangıç ​​aralığı kullandığını

using System; 
using System.Threading; 

static class Program 
{ 
    private static Timer timer = new Timer(TimerCallBack); 
    private static bool changed = false; 

    public static void Main() 
    { 
     timer.Change(TimeSpan.Zero, TimeSpan.FromSeconds(1)); 
     Thread.Sleep(10000); 

    } 

    private static void TimerCallBack(object obj) 
    { 
     Console.WriteLine("{0}: Fired", DateTime.Now); 
     if (!changed) 
     { 
      changed = true; 
      TimeSpan interval = TimeSpan.FromSeconds(3); 
      timer.Change(interval, interval); 
     } 
    } 
} 

Not

(yukarıdaki örneklerde 1 saniye) Örnek Çünkü hemen aramayı Change numaralı telefondan aramamız gerekiyor - eğer ilk görüşmeden önce gerçekten farklı bir zaman istiyorsanız,'a ilk aramada TimeSpan.Zero'u kullanmayın.

+0

Çok teşekkür ederim! – mrbrooks

+0

Sadece kayıt için, "Infinite" için -1 kullanabiliyorken, dokümanlar niyetini daha açık bir şekilde gösterdiğine inandığım "Timeout.Infinite" yi kullanabileceğinizi söylüyor. ;) –

+0

@JamesWilkins: True Will düzenleme yapar. ("Timeout.Infinite" bir "TimeSpan" olsaydı daha açık olurdu - Timer.Change (int, int) için dokümanlar "Timeout.Infinite", "Timer.Change (TimeSpan, TimeSpaan)" 'don't :( –

İlgili konular