2014-04-04 19 views
0

相關部分的集合的值是在這裏:我的循環的第二次迭代顯示在一個不同的順序碼的第一個

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這段代碼開始。當我點擊StopButtonLoopCheck值設置爲false。這意味着循環停止。它在第一次點擊開始時效果很好。

當我點擊開始再次WordsOfFile中的字未按正確的順序顯示。這意味着我錯過了foreach區塊。

它可能是什麼?

+0

什麼是WordsOfFile?它是一個List嗎?給我們更多的代碼...因爲我們不知道這些元素是什麼。 –

+0

這是一個異步的過程,這意味着沒有同步和沒有訂單... – Dimitri

+0

我已經改變了你的標題爲更具描述性的東西。如果這不是你的意思,請澄清你確切的問題。 –

回答

1

await Task.Delay()所做的是在每次迭代中創建延遲任務。因此,即使您將LoppCheck的值從true更改爲false,仍然會創建已創建的任務。這就是爲什麼你可以看到不正確順序的單詞。而且我可以說你看到的單詞變化比你指定的更快。這是因爲等待延遲仍在工作。所以你需要取消這些任務。

here是MSDN有關取消任務的文檔。

1

await關鍵字告訴程序遍歷foreach並在Task.Delay完成時回來。但由於Task.Delay不準確哪個線程從等待回來無法控制。而且你的結果不按順序。

您必須執行排序。

根據你試圖達到的目標,可能會有更好的選擇。

編輯:

如果你正在試圖做的一切都是有響應性的UI,看看BackgroundWorker class。起初看起來很複雜,但不是。

+0

那麼,它是如何在第一次迭代中完美運行的? – Zgrkpnr

+0

因爲第一次迭代是第一次,並且沒有其他線程正在運行,並且它的第一次返回 – Dimitri

+0

所以,有沒有辦法在WordToShow = word之間添加延遲?並保持應用程序響應?我已經嘗試過Thread.sleep(),但它保持應用程序被困住。 – Zgrkpnr

相關問題