Каков наилучший способ реализации "таймера"?

Возможный дубликат:
Как добавить таймер в консольное приложение С#

Каков наилучший способ реализации таймера? Образец кода был бы замечательным! По этому вопросу "лучший" определяется как наиболее надежный (наименьшее количество пропусков) и точный. Если я укажу интервал в 15 секунд, я хочу, чтобы целевой метод вызывался каждые 15 секунд, а не каждые 10-20 секунд. С другой стороны, мне не нужна точность наносекунд. В этом примере было бы приемлемым, чтобы способ срабатывал каждые 14,51-15,49 секунды.

Ответ 1

Используйте класс Timer.

public static void Main()
{
    System.Timers.Timer aTimer = new System.Timers.Timer();
    aTimer.Elapsed += new ElapsedEventHandler(OnTimedEvent);
    aTimer.Interval = 5000;
    aTimer.Enabled = true;

    Console.WriteLine("Press \'q\' to quit the sample.");
    while(Console.Read() != 'q');
}

 // Specify what you want to happen when the Elapsed event is raised.
 private static void OnTimedEvent(object source, ElapsedEventArgs e)
 {
     Console.WriteLine("Hello World!");
 }

Событие Elapsed будет вызываться каждые X миллисекунд, указанных в свойстве Interval объекта Timer. Он вызовет указанный вами метод Event Handler. В приведенном выше примере это OnTimedEvent.

Ответ 2

Используя класс System.Windows.Forms.Timer, вы можете достичь того, что вам нужно.

System.Windows.Forms.Timer t = new System.Windows.Forms.Timer();


t.Interval = 15000; // specify interval time as you want
t.Tick += new EventHandler(timer_Tick);
t.Start();

void timer_Tick(object sender, EventArgs e)
{
      //Call method
}

Используя метод stop(), вы можете остановить таймер.

t.Stop();

Ответ 3

Непонятно, какой тип приложения вы собираетесь разрабатывать (рабочий стол, сеть, консоль...)

Общий ответ, если вы разрабатываете приложение Windows.Forms, использует

System.Windows.Forms.Timer. Преимущество этого в том, что он работает на потоке UI, поэтому просто его определить, подпишитесь на его Tick событие и запустите свой код каждые 15 секунд,

Если вы делаете что-то еще, то окна формируются (это неясно из вопроса), вы можете выбрать System.Timers.Timer, но этот пробег работает на другой, поэтому, если вы собираетесь воздействовать на некоторые элементы пользовательского интерфейса из своего Elapsed события, вам нужно управлять им с помощью "вызова" доступа.

Ответ 4

Ссылка ServiceBase на ваш класс и поместите нижеприведенный код в событие OnStart:

Constants.TimeIntervalValue = 1 (час). В идеале вы должны установить это значение в файле конфигурации.

StartSendingMails = имя функции, которое вы хотите запустить в приложении.

 protected override void OnStart(string[] args)
        {
            // It tells in what interval the service will run each time.
            Int32 timeInterval = Int32.Parse(Constants.TimeIntervalValue) * 60 * 60 * 1000;
            base.OnStart(args);
            TimerCallback timerDelegate = new TimerCallback(StartSendingMails);
            serviceTimer = new Timer(timerDelegate, null, 0, Convert.ToInt32(timeInterval));
        }