Класс таймера C # - остановка после определенного количества выполнений - PullRequest
2 голосов
/ 13 сентября 2009

Я изучал класс Timer (http://msdn.microsoft.com/en-us/library/system.timers.timer.aspx),, но дело в таймере в том, что он работает. Есть ли способ остановить его после одного хода?

Сейчас я делаю следующее:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Timers;

namespace TimerTest
{
    class Program
    {
        private static System.Timers.Timer aTimer;
        static void Main(string[] args)
        {
            DoTimer(1000, delegate
            {
                Console.WriteLine("testing...");
                aTimer.Stop();
                aTimer.Close();
            });
            Console.ReadLine();
        }

        public static void DoTimer(double interval, ElapsedEventHandler elapseEvent)
        {
            aTimer = new Timer(interval);
            aTimer.Elapsed += new ElapsedEventHandler(elapseEvent);
            aTimer.Start();
        }
    }
}

Ответы [ 5 ]

5 голосов
/ 13 сентября 2009

Это не так, как сейчас. Событие Elapsed возникает один раз и останавливается, потому что вы вызвали Stop. В любом случае, измените свой код следующим образом, чтобы выполнить то, что вы хотите.

private static int  iterations = 5;
static void Main()
{
  DoTimer(1000, iterations, (s, e) => { Console.WriteLine("testing..."); });
  Console.ReadLine();
}

static void DoTimer(double interval, int iterations, ElapsedEventHandler handler)
{
  var timer = new System.Timers.Timer(interval);
  timer.Elapsed += handler;
  timer.Elapsed += (s, e) => { if (--iterations <= 0) timer.Stop(); };
  timer.Start();
}
4 голосов
/ 13 сентября 2009

Почему у вас просто нет счетчика int, который изначально начинается с 0 и увеличивается каждый раз при срабатывании ElapsedEventHandler? Затем вы просто добавляете проверку в обработчике событий к Stop() таймеру, если счетчик превышает количество итераций.

0 голосов
/ 11 октября 2012

Создавая объект данного класса, вы можете использовать таймер в любом классе

public class timerClass
    {


        public timerClass()
        {
            System.Timers.Timer aTimer = new System.Timers.Timer();
            aTimer.Elapsed += new ElapsedEventHandler(OnTimedEvent);
            // Set the Interval to 5 seconds.
            aTimer.Interval = 5000;
            aTimer.Enabled = true;
        }

        public static void OnTimedEvent(object source, ElapsedEventArgs e)
        {
          Console.Writeln("Welcome to TouchMagix");
        }
}
0 голосов
/ 13 сентября 2009
public static void DoTimer(double interval, ElapsedEventHandler elapseEvent)
{
    aTimer = new Timer(interval);
    aTimer.Elapsed += new ElapsedEventHandler(elapseEvent);
    aTimer.Elapsed += new ElapsedEventHandler( (s, e) => ((Timer)s).Stop() );
    aTimer.Start();
}
0 голосов
/ 13 сентября 2009

Используйте System.Threading.Timer и укажите dueTime, но укажите период Timeout.Infinite.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...