簡體   English   中英

在foreach循環中的每個迭代之后如何做延遲?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM