循环的第二次迭代以与第一次不同的顺序显示集合的值

本文关键字:顺序 显示 集合 第一次 第二次 迭代 循环 | 更新日期: 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 类。乍一看似乎很复杂,但事实并非如此。