[英]How to do a delay after every iteration in a foreach loop?
我想在foreach循環中的每次迭代之后添加一個延遲,因此Treat方法僅每2秒被調用一次。 我不希望使用Thread.Sleep
因為我希望仍然能夠循環運行時使用我的程序。 我試圖告訴foreach循環在進行下一次迭代之前要等待2秒鍾。 這是我到目前為止的內容:
public async void HandlingAsync(ListViewItem woodItem)
{
IList<ListViewItem> woodList = new List<ListViewItem>();
woodList.Add(woodItem);
foreach(ListViewItem Item in woodList)
{
await Task.Delay(2000);
Treat(Item);
}
}
public void Treat(ListViewItem woodItem)
{
woodItem.SubItems[3].Text = "dried";
woodItem.SubItems[4].Text = "Ok";
}
這是行不通的,因為await
命令不會影響foreach循環,只會影響其中的命令。 我可以確認這一點,因為ListView同時更改了所有項目,而它應該更改一個項目並等待2秒才能更改下一個項目。
編輯 :馬克·格雷夫(Marc Gravell)權。 foreach循環絕對遵守await
命令。 因此,他的回答有效100%。 我的問題既不在foreach循環中,也不在await
命令中。 這沒有用,因為我的HandlingAsync方法被多次調用了。 這導致幾乎立即將處理方法調用多次。 這意味着,每個woodItem都會在同一時間更改,但要延遲2秒。 為了解決這個問題, HandlingAsync應該只被調用一次 。 謝謝你的幫助。
foreach
方面await
就好了; 這是控制台中的示例:
static async Task Main()
{
string[] woodList = { "maple", "ash", "oak", "elm", "birch" };
foreach (string wood in woodList)
{
Treat(wood);
await Task.Delay(2000);
}
}
private static void Treat(string wood)
{
Console.WriteLine($"{DateTime.Now}: treating {wood}");
}
對我來說輸出是(明顯的停頓):
28/08/2018 15:45:10: treating maple
28/08/2018 15:45:12: treating ash
28/08/2018 15:45:14: treating oak
28/08/2018 15:45:16: treating elm
28/08/2018 15:45:18: treating birch
因此:如果您的代碼未達到預期的效果-問題不foreach
/ await
。 您能否顯示更多周圍環境,並指出是什么讓您認為它不起作用?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.