как получение предполагаемого вывода в таймере

Я работаю с двумя таймерами:

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 это возвращается к новичку. Но я должен отладить в том же порядке как без точек останова.
Мне нужно для этого в другом приложении. Почему это происходит?

1
задан tanascius 9 June 2010 в 13:04
поделиться

3 ответа

Проблема в том, что базовый таймер продолжит выполнение , даже если вы остановил вашу программу с помощью точки останова. Используемый вами 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 вы можете прочитать эту статью .

2
ответ дан 2 September 2019 в 23:55
поделиться

Вероятно, это происходит из-за того, что вы отлаживаете?

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

Ужасный английский, кстати. Даже не знаю, правильно ли я вас здесь понял.

0
ответ дан 2 September 2019 в 23:55
поделиться

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

0
ответ дан 2 September 2019 в 23:55
поделиться
Другие вопросы по тегам:

Похожие вопросы: