我正在創建一個程序,其中數據正在填充到列表框中。當我點擊一個複選框來循環時,它應該從一開始就循環。當我點擊複選框時,它不檢查,並且由於無限循環,它也阻止我點擊其他任何東西。有沒有人知道這個解決方案?使用複選框循環
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。 –