Я работаю с двумя таймерами:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace example
{
public partial class Form1 : Form
{
int i = 0;
int j = 0;
public Form1()
{
InitializeComponent();
timer1.Interval = 3000;
}
private void button1_Click(object sender, EventArgs e)
{
timer1.Enabled = true;
}
private void timer1_Tick(object sender, EventArgs e)
{
i++;
timer2.Enabled = true;
if (i < 3)
time1(i);
else
timer1.Enabled = false;
}
private void timer2_Tick(object sender, EventArgs e)
{
j++;
timer2.Interval = timer1.Interval / 5;
if (j < 5)
time2(j);
else
timer2.Enabled = false;
}
private void time1(int i)
{
MessageBox.Show(i.ToString(), "First Timer");
}
private void time2(int j)
{
MessageBox.Show(j.ToString(), "SecondTimer");
}
}
}
при запущении этой программы это дает вывод как это:
firsttimer:1
secondTimer:1
secondTimer:2
secondTimer:3
secondTimer:4
firsttimer:2
в окне сообщения.
Но при отладке, отладка не может переместиться в тот порядок. После того, как закончено secondtimer:2 это возвращается к новичку. Но я должен отладить в том же порядке как без точек останова.
Мне нужно для этого в другом приложении. Почему это происходит?
Проблема в том, что базовый таймер продолжит выполнение , даже если вы остановил вашу программу с помощью точки останова. Используемый вами System.Windows.Forms.Timer
вызовет еще одно событие (в то время как System.Timers.Timer
продолжит запускать множество событий). Вы можете попробовать это самостоятельно:
Установите таймер на интервал, например, 3000 мс и установите точку останова в его обработчике событий:
private void timer1_Tick( object sender, EventArgs e )
{
// insert breakpoint here
}
Подождите ~ 3 секунды, прежде чем продолжить вашу программу. Обработчик событий будет немедленно вызван снова. В следующий раз подождите дольше (~ 10 секунд), результат тот же - обработчик событий будет запущен сразу один раз, затем через ~ три секунды. Сравните поведение с System.Timers.Timer
, который вызовет событие во втором тестовом сценарии более одного раза.
Итак, в зависимости от вашей точки останова (вы устанавливаете ее в timer1_Tick
до timer2.Enabled = true;
или после?) И от времени остановки вашей программы перед продолжением выполнения вы получите разные результаты.
К сожалению, вы ничего не можете сделать. В вашем особом случае вы можете остановить все таймеры перед установкой точки останова, например:
private static void Break()
{
var timer1Enabled = timer1.Enabled;
var timer2Enabled = timer2.Enabled;
timer1.Stop();
timer2.Stop();
// insert breakpoint here
timer1.Enabled = timer1Enabled;
timer2.Enabled = timer2Enabled;
}
, но это приведет к перезапуску таймеров, и соотношение между интервалами timer1 и timer2 будет неправильным.
Для получения дополнительной информации о таймерах .net вы можете прочитать эту статью .
Вероятно, это происходит из-за того, что вы отлаживаете?
Попробуйте умножить интервалы на 10, чтобы вы могли внимательно следить за кодом вручную, как это было бы без пошагового выполнения.
Ужасный английский, кстати. Даже не знаю, правильно ли я вас здесь понял.
, когда вы отлаживаете приложение, вы не можете полагаться на таймеры должны срабатывать с правильным интервалом, так как программа может быть остановлена в точке останова. попробуйте удалить все точки останова и посмотрите, работают ли таймеры во время отладки.