C#定时器-定时器运行时运行代码

C#定时器-定时器运行时运行代码,c#,winforms,timer,C#,Winforms,Timer,我是C#新手,我正在尝试使用学习Android应用程序开发时学到的Windows窗体创建一个简单的大脑训练程序。我被计时器卡住了。我让它工作,它每秒钟触发一次,并更新我表格上的标签。当我在启动计时器后添加代码时,计时器停止。好像我没有在后台跑步。我读过很多关于线程定时器和定时器等的书,但我没能让任何东西正常工作。就像我说的,我是C#的新手,所以请温柔点。。。。他是我的密码 public partial class BrainTrainer : Form { // Set global t

我是C#新手,我正在尝试使用学习Android应用程序开发时学到的Windows窗体创建一个简单的大脑训练程序。我被计时器卡住了。我让它工作,它每秒钟触发一次,并更新我表格上的标签。当我在启动计时器后添加代码时,计时器停止。好像我没有在后台跑步。我读过很多关于线程定时器和定时器等的书,但我没能让任何东西正常工作。就像我说的,我是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);   
        }

    }

}
公共部分课程BrainTrainer:表格
{
//设置全局计时器变量&创建计时器
静态计数器=10;
静态布尔播放=错误;
静态计时器myTimer=新计时器();
公共脑培训师()
{
//设立表格
初始化组件();
切换标签(假);
timerLbl.Text=secondCounter.ToString()+“s”;
}
//函数循环浏览标签并禁用它们
专用无效切换标签(布尔状态)
{
var ansLabels=this.Controls.OfType()
.Where(c=>c.Name.StartsWith(“ans”))
.ToList();
foreach(ansLabels中的var标签)
{
label.Enabled=状态;
}
}
//事件以每秒运行一次
私有void TimerEventProcessor(对象myObject,事件参数e)
{
if(secondCounter==0)
{
//停止游戏
myTimer.Stop();
玩=假;
}
其他的
{
//倒计时1和更新标签
第二计数器--;
timerLbl.Text=secondCounter.ToString()+“s”;
}
}
私有无效开始单击(对象发送方,事件参数e)
{
//隐藏按钮,将播放设置为true并启用标签
startBtn.Hide();
玩=真;
切换标签(真);
//设置计时器事件、间隔和启动
myTimer.Tick+=新事件处理程序(TimerEventProcessor);
myTimer.Interval=1000;
myTimer.Start();
//运行要播放的函数
基因方程式();
}
私有void genEquation()
{
边玩
{
控制台写入线(第二计数器);
}
}
}
非常感谢您提供的任何帮助,或者链接到有用的教程将非常棒

问题在评论中得到了解决

您正在阻止当前线程,并且没有给它时间来处理.Tick事件。Winforms计时器不会为其启动线程。尝试调用genEquation()循环中的Application.DoEvents()来处理事件

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

如果您想从计时器回调中更改任何UI元素,请使用DispatcherTimer类。计时器就像节拍器上的节拍器,它会做一些事情,但在下一个节拍器上它不会做任何事情。例如,设置为15秒的计时器和标签上显示日期/时间的计时器将每15秒更新一次。。没有其他事情发生您每次单击按钮时都在添加事件订阅,这可能会导致严重错误您知道这不是
WPF
,事实上您使用的是
Winforms
,只是猜测:您正在阻止当前线程,没有给它时间处理.Tick事件。Winforms计时器不会为其启动线程。尝试调用genEquation()循环中的Application.DoEvents()来处理事件。