我正在创建一个程序,其中数据正在填充到列表框中。当我点击一个复选框来循环时,它应该从一开始就循环。当我点击复选框时,它不检查,并且由于无限循环,它也阻止我点击其他任何东西。有没有人知道这个解决方案?使用复选框循环
private void checkBox1_CheckedChanged(object sender, EventArgs e)
{
while(checkBox1.Checked == true)
{
Play();
}
}
我正在创建一个程序,其中数据正在填充到列表框中。当我点击一个复选框来循环时,它应该从一开始就循环。当我点击复选框时,它不检查,并且由于无限循环,它也阻止我点击其他任何东西。有没有人知道这个解决方案?使用复选框循环
private void checkBox1_CheckedChanged(object sender, EventArgs e)
{
while(checkBox1.Checked == true)
{
Play();
}
}
您可能需要播放以在后台线程上执行,或者您需要脉冲窗口消息泵,以便让UI时间对输入做出反应。这是后者:
private void checkBox1_CheckedChanged(object sender, EventArgs e)
{
while(checkBox1.Checked == true)
{
Play();
Application.DoEvents();
}
}
DoEvents使窗口处理当前在消息队列中的任何消息(例如UI输入)。没有它,windows消息就不会被处理,因为Play在UI线程上,并且消息泵永远没有机会运行,所以即使你疯狂地点击复选框,窗口也没有机会告诉你的应用程序。
有很多方法可以在后台线程上播放。这些例子比DoEvents的消息泵方法更有意义。
裸记住,多线程更多的是一种先进的办法,可能难以正确实现,虽然是值得理解。
我做了基于任务并行库(TPL)的实现。 TPL现在是Microsoft推荐的事实上的多线程范例。特别是TPL最擅长在后台进行其他工作时保持UI的响应。这里是相同的代码片段:
private void checkBox1_CheckedChanged(object sender, EventArgs e)
{
if (checkBox1.Checked == true)
{
//iterate list box items on a thread-pool thread using TPL
Task.Run(() => Play());
}
}
private void Play()
{
//listBox1 is the name of the list box control in my windows forms application
foreach (var listboxItem in listBox1.Items)
{
//check if the checkbox is currently in checked state
if(checkBox1.Checked)
{
//Checkbox is checked so process the listbox item
Console.WriteLine(listboxItem.ToString());
//do other required stuff
}
else
break;
}
}
WinForms? ASP.NET?还有别的吗? – Tim
我认为你需要使用if块而不是while块。我猜你的循环是在Play()方法中。 – Jayee
对不起,Winforms。 –