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()的目的是什么”是否太过分了。