如何在foreach循环中的每次迭代后进行延迟?

Car*_*y's 2 c# foreach

我想在 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";
    }
Run Code Online (Sandbox Code Playgroud)

这不起作用,因为该await命令不会影响 foreach 循环,只会影响其中的命令。我可以确认这一点,因为 ListView 同时更改其所有项目,而它应该更改一个项目并等待 2 秒钟,然后再更改下一个项目。

编辑:Marc Gravell 是对的。foreach 循环绝对尊重await命令。所以他的回答100%有效。我的问题既不在 foreach 循环中也不在await命令中。它没有工作,因为我的HandlingAsync方法被多次调用。这导致几乎立即多次调用Treat方法。这意味着,每个 woodItem 同时更改,延迟 2 秒。为了解决这个问题,HandlingAsync应该只被调用一次。谢谢你的帮助。

Mar*_*ell 6

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}");
}
Run Code Online (Sandbox Code Playgroud)

我的输出是(有明显的停顿):

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
Run Code Online (Sandbox Code Playgroud)

所以:如果您的代码没有按预期运行 - 问题不在于foreach/ await。您能否展示更多周围的环境,并指出是什么让您认为它不起作用?