您好我正在尝试编程一些复选框,以编程方式以特定顺序检查和取消选中。我知道这听起来很愚蠢,但这对应于我已编码检查事件的一些LED控件。
我想检查一个复选框以启动此序列并取消选中它以停止它。目前检查和取消选中我的D2复选框很正常,但是do while
循环冻结了表单,所以我实际上无法取消选中循环框。我可能不应该使用Thread.Sleep
。任何建议都表示赞赏。
private void cycleCheckBox_CheckedChanged(object sender, EventArgs e)
{
do
{
D2.Checked = true;
Thread.Sleep(1000);
D2.Checked = false;
Thread.Sleep(1000);
} while (cycleCheckBox.Checked);
}
答案 0 :(得分:1)
如果直接在checked事件中调用Thread.Sleep
方法将在UI线程上运行,这就是UI冻结的原因。将工作推送到System.Windows.Forms.Timer(假设这是一个WinForms应用程序):
实现以用户定义的间隔引发事件的计时器。 此计时器已针对Windows窗体应用程序进行了优化,并且必须 在窗口中使用。
基于您的问题的示例:
Timer _timer;
private void cycleCheckBox_CheckedChanged(object sender, EventArgs e)
{
if(_timer == null )
{
_timer = new Timer();
_timer.Interval = 1000; // 1 second
_timer.Tick += DoTimerWork;
}
if(cycleCheckBox.Checked)
{
_timer.Start();
}
else
{
_timer.Stop();
}
}
private void DoTimerWork(object obj, EventArgs args)
{
D2.Checked = !D2.Checked;
}
答案 1 :(得分:0)
我不知道这对你是否有用,但是我要做的是在1000毫秒时在Timer Control中拖动并使用一种方法通过使用循环为0的整数来确定当前应该检查哪个复选框某个点并在每个刻度处递增。