Остановка таймера C# после некоторого количества тиков автоматически

Как остановить таймер после некоторого количества тиков или, скажем, через 3-4 секунды?

поэтому я запускаю таймер, и я хочу после 10 тиков или через 2-3 секунды автоматически остановиться.

спасибо!

5 ответов


вы можете держать счетчик, как

 int counter = 0;

затем в каждом ТИКе вы увеличиваете его. После вашего предела вы можете остановить таймер. Сделайте это в своем тиковом событии

 counter++;
 if(counter ==10)  //or whatever your limit is
   yourtimer.Stop();

при достижении заданного интервала таймера (через 3 секунды), timer1_Tick() будет вызван обработчик событий, и вы можете остановить таймер в обработчике событий.

Timer timer1 = new Timer();

timer1.Interval = 3000;

timer1.Enabled = true;

timer1.Tick += new System.EventHandler(timer1_Tick);


void timer1_Tick(object sender, EventArgs e)
{
    timer1.Stop();  // or timer1.Enabled = false;
}

Я вообще говорю, потому что вы не упомянули, какой таймер, но у всех есть тики... Итак:

вам понадобится счетчик в классе как

int count;

который вы инициализируете в начале своего таймера, и вам понадобится dateTime, как

DateTime start;

который вы инициализируете в начале своего таймера:

start = DateTime.Now;

и в вашем методе тика вы будете делать:

if(count++ == 10 || (DateTime.Now - start).TotalSeconds > 2)
   timer.stop()

вот пример

public partial class meClass : Form
{
  private System.Windows.Forms.Timer t;
  private int count;
  private DateTime start;

  public meClass()
  {
     t = new Timer();
     t.Interval = 50;
     t.Tick += new EventHandler(t_Tick);
     count = 0;
     start = DateTime.Now;
     t.Start();
  }

  void t_Tick(object sender, EventArgs e)
  {
     if (count++ >= 10 || (DateTime.Now - start).TotalSeconds > 10)
     {
        t.Stop();
     }
     // do your stuff
  }
}

Если вы используете System.Windows.Forms.Tick. Вы можете отслеживать счетчик и время, когда он живет так. Его хороший способ использовать свойство Tag таймера. Это делает его многоразовым для других таймеров и сохраняет общий код вместо использования глобально определенного int counter для каждого таймера.

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

    System.Windows.Forms.Timer ExampleTimer = new System.Windows.Forms.Timer();
    ExampleTimer.Tag = new CustomTimerStruct
    {
        Counter = 0,
        StartDateTime = DateTime.Now,
        MaximumSecondsToLive = 10,
        MaximumTicksToLive = 4
    };

    //Note the order of assigning the handlers. As this is the order they are executed.
    ExampleTimer.Tick += Generic_Tick;
    ExampleTimer.Tick += Work_Tick;
    ExampleTimer.Interval = 1;
    ExampleTimer.Start();


    public struct CustomTimerStruct
    {
            public uint Counter;
            public DateTime StartDateTime;
            public uint MaximumSecondsToLive;
            public uint MaximumTicksToLive;
    }

    void Generic_Tick(object sender, EventArgs e)
    {
            System.Windows.Forms.Timer thisTimer = sender as System.Windows.Forms.Timer;
            CustomTimerStruct TimerInfo = (CustomTimerStruct)thisTimer.Tag;
            TimerInfo.Counter++;
            //Stop the timer based on its number of ticks
            if (TimerInfo.Counter > TimerInfo.MaximumTicksToLive) thisTimer.Stop();
            //Stops the timer based on the time its alive
            if (DateTime.Now.Subtract(TimerInfo.StartDateTime).TotalSeconds > TimerInfo.MaximumSecondsToLive) thisTimer.Stop();
    }

    void Work_Tick(object sender, EventArgs e)
    {
        //Do work specifically for this timer
    }

при инициализации таймера установите значение тега в 0 (ноль).

tmrAutoStop.Tag = 0;

потом, с каждым тиком добавить один...

tmrAutoStop.Tag = int.Parse(tmrAutoStop.Tag.ToString()) + 1;

и проверьте, достиг ли он желаемого номера:

if (int.Parse(tmrAutoStop.Tag.ToString()) >= 10)
{
  //do timer cleanup
}

используйте эту же технику, чтобы чередовать событие, связанное с таймером:

if (int.Parse(tmrAutoStop.Tag.ToString()) % 2 == 0)
{
  //do something...
}
else
{
  //do something else...
}

чтобы проверить прошедшее время (в секундах):

int m = int.Parse(tmrAutoStop.Tag.ToString()) * (1000 / tmrAutoStop.Interval);