C# Timer - запускать код во время работы таймера

Я новичок в C# и пытаюсь создать простую программу тренировки мозга с использованием Windows Forms, которую я изучил, изучая разработку приложений для Android. Я застрял на таймере. У меня он работает, он срабатывает каждую секунду и обновляет метку в моей форме. Когда я добавляю код после запуска таймера, таймер останавливается. Как будто я не работаю в фоновом режиме. Я много читал о таймерах потоковой передачи, таймерах и т. д., Но мне не удалось заставить что-либо работать. Как я уже сказал, я новичок в C#, поэтому будьте осторожны ... Он мой код ....

public partial class BrainTrainer : Form
{
    // Set global timer variables & Create Timer
    static int secondCounter = 10;
    static bool play = false;
    static Timer myTimer = new Timer();


    public BrainTrainer()
    {
        // Set up form
        InitializeComponent();
        toggleLabels(false);
        timerLbl.Text = secondCounter.ToString() + "s";


    }

    // Function to loop through labels and disabled them
    private void toggleLabels(bool state)
    {
        var ansLabels = this.Controls.OfType<Label>()
            .Where(c => c.Name.StartsWith("ans"))
            .ToList();

        foreach (var label in ansLabels)
        {

            label.Enabled = state;
        }
    }

    // Event to run every second
    private void TimerEventProcessor(Object myObject, EventArgs e)
    {
        if (secondCounter == 0)
        {
            //Stop Game
            myTimer.Stop();
            play = false;

        }
        else
        {
            // Countdown 1 and update label
            secondCounter--;
            timerLbl.Text = secondCounter.ToString()+"s";
        }
    }

    private void startBtn_Click(object sender, EventArgs e)
    {
        // Hide button, set play to true and enable labels
        startBtn.Hide();
        play = true;
        toggleLabels(true);

        // Set up timer event, interval and start
        myTimer.Tick += new EventHandler(TimerEventProcessor);
        myTimer.Interval = 1000;
        myTimer.Start();
        // Run function to play
        genEquation();    

    }

    private void genEquation()
    {
        while (play)
        {
            Console.WriteLine(secondCounter);   
        }

    }

}

Мы будем очень благодарны за любую помощь или ссылку на полезное руководство!

Если вы хотите изменить какие-либо элементы пользовательского интерфейса из обратного вызова таймера, используйте класс DispatcherTimer.

Clemens 02.05.2018 13:24

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

BugFinder 02.05.2018 13:25

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

FindOutIslamNow 02.05.2018 13:25

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

Neil White 02.05.2018 13:34

@BugFinder, спасибо, я понял. Но галочка перестает «тикать», когда я запускаю код после запуска таймера.

Neil White 02.05.2018 13:35

@FindOutIslamNow, как бы мне это сделать. Я попытался поместить .tick и .interval вне функции, где я инициализировал таймер, но он не принял его.

Neil White 02.05.2018 13:37

@FindOutIslamNow, отсортировал. Вставьте основной метод.

Neil White 02.05.2018 13:38

Трудно сказать, но правильно ли это работает в первый раз? Или вообще не работает?

Sean 02.05.2018 13:41

Вы знаете, что это не WPF, и на самом деле вы используете Winforms.

Franck 02.05.2018 13:43

Просто предположение: вы блокируете текущий поток и не даете ему времени на обработку .Tick-Event. Winforms-Timer не запускает для этого поток. Попробуйте вызвать Application.DoEvents () в цикле genEquation (), чтобы обработать событие.

Hyarus 02.05.2018 13:46

Нет, вообще не побежит. Если я не включу genEquation(). Все работает нормально, мой таймер работает и отсчитывает, обновляет метку и т. д. Как только я пытаюсь запустить genEquation(), который представляет собой цикл, таймер останавливается. Если я удалю цикл и просто заставлю эту функцию отображать окно сообщения, она сработает. Это как-то связано с многопоточностью? Если да, то как мне обойти это, не зная об этом!

Neil White 02.05.2018 13:47

@Hyarus, вот и все. Работаю сейчас! Ваше здоровье!!!

Neil White 02.05.2018 13:53

Спасибо, @Franck, сказал, что я полный C# noob ;-)

Neil White 02.05.2018 13:54
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
13
531
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Проблема решена в комментариях

Вы блокируете текущий поток и не даете ему времени на обработку .Tick-Event. Winforms-Timer не запускает для этого поток. Попробуйте вызвать Application.DoEvents () в цикле genEquation (), чтобы обработать событие.

private void genEquation()
{
    while (play)
    {
        Application.DoEvents();   
        Console.WriteLine(secondCounter);
    }    
}

Другие вопросы по теме