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