循环的第二次迭代以与第一次不同的顺序显示集合的值
本文关键字:顺序 显示 集合 第一次 第二次 迭代 循环 | 更新日期: 2023-09-27 17:56:47
代码的相关部分在这里:
private async void Start_Button_Click(object sender, EventArgs e)
{
try
{
timer1.Interval = 50;
timer1.Enabled = true;
timer1.Start();
LoopCheck = true;
trackBar1.Hide();
label1.Hide();
label2.Hide();
label3.Hide();
label4.Hide();
label5.Hide();
label6.Hide();
label7.Hide();
label8.Hide();
label9.Hide();
label10.Hide();
label11.Hide();
textBox1.Font = new System.Drawing.Font("Times New Roman", 24F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(162)));
while (LoopCheck)
{
foreach (string word in WordsOfFile)
{
WordToShow = word;
await Task.Delay(time);
}
}
}
catch
{
System.Windows.Forms.MessageBox.Show("You need to add text by clicking 'Load Text' button", "Error!");
textBox1.Font = new System.Drawing.Font("Times New Roman", 10F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(162)));
LoopCheck = false;
timer1.Stop();
trackBar1.Show();
label1.Show();
label2.Show();
label3.Show();
label4.Show();
label5.Show();
label6.Show();
label7.Show();
label8.Show();
label9.Show();
label10.Show();
label11.Show();
}
}
private void Stop_Button_Click(object sender, EventArgs e)
{
LoopCheck = false;
timer1.Stop();
trackBar1.Show();
label1.Show();
label2.Show();
label3.Show();
label4.Show();
label5.Show();
label6.Show();
label7.Show();
label8.Show();
label9.Show();
label10.Show();
label11.Show();
}
在此代码之外,我将在文本框中显示此WordToShow
字符串。当我单击StartButton
时,此代码块启动。当我单击StopButton
时,此LoopCheck
值设置为 false
。这意味着循环已停止。它在第一次单击开始时效果很好。
再次单击开始后,WordsOfFile
中的单词未按正确的顺序显示。这意味着我错过了有关foreach
块的一些内容。
会是什么?
await Task.Delay()
所做的是在每次迭代中创建延迟任务。因此,即使您LoppCheck
值从 true 更改为 false,您仍然拥有已创建的任务。 这就是为什么您可以看到顺序不正确的单词的原因。我也可以说你看到单词的变化比你分配的要快。这是因为等待的延误仍在进行中。因此,您需要取消该任务。
下面是有关取消任务的 MSDN 文档。
await
关键字告诉程序遍历foreach
并在Task.Delay
完成后返回。 但是由于Task.Delay
不精确,因此无法控制从 await 返回的线程。你把结果弄乱了。
您必须实现排序。
根据您要实现的目标,可能会有更好的选择。
编辑:
如果您尝试做的只是有一个响应式 UI,请查看 BackgroundWorker 类。乍一看似乎很复杂,但事实并非如此。