Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/333.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 循环的第二次迭代以与第一次不同的顺序显示集合的值_C#_String_Foreach - Fatal编程技术网

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

C# 循环的第二次迭代以与第一次不同的顺序显示集合的值,c#,string,foreach,C#,String,Foreach,代码的相关部分如下所示: 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(

代码的相关部分如下所示:

 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
时,此代码块开始。当我单击
stop按钮时
LoopCheck
值设置为
false
。这意味着循环停止。它在第一次单击开始时工作良好

单击“重新开始”后,
WordsOfFile
中的单词未按正确顺序显示。这意味着我缺少了有关
foreach
块的一些信息


可能是什么

wait
关键字告诉程序遍历
foreach
,并在
任务完成后返回。Delay
。但是由于
Task.Delay
并不精确,所以等待返回的线程无法控制。你会把结果弄得乱七八糟

你必须实施订购

根据你想要达到的目标,可能会有更好的选择

编辑:


如果你想做的只是拥有一个响应性强的用户界面,那就调查一下。一开始它可能看起来很复杂,但事实并非如此。

等待任务的是延迟()在每次迭代中创建延迟任务。因此,即使您将
LoppCheck
值从true更改为false,您仍然拥有创建的任务。这就是为什么你能看到顺序不正确的单词。我还可以说,你看到单词的变化比你指定的要快。这是因为等待的延误仍在继续。所以你需要取消那些任务


MSDN的文档是关于取消任务的。

什么是WordsOfFile?它是一个
列表
?给我们更多的代码。。。因为我们不知道这些元素是什么。这是一个异步过程,意味着没有同步,也没有顺序……我把你的标题改成了更具描述性的内容。如果这不是你的意思,请澄清你的确切问题。你需要发布更多的代码,比如在哪里初始化LoopCheck和WordsToShow,在哪里设置它们,以及Start和Stop方法如何与之交互loop@JeroenVannevel非常感谢。这个版本更可靠。再次感谢你。那么,为什么它在第一次迭代中工作得非常好呢?因为第一次迭代是第一次,没有其他线程运行,而且是第一次返回呢?有没有办法在WordToShow=word之间增加延迟;同时保持应用程序的响应性?我试过Thread.sleep(),但它让应用程序一直处于停滞状态。如果添加延迟,就违背了async/await的全部目的。若你们想要的只是响应性的UI,那个么看看BackgroundWorker。它允许您在后台线程上执行长时间运行的进程,并在完成后更新UI。它看起来更像我想要的。问“等待teask.delay()的目的是什么”是否太过分了。