gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 17:05:18 25 4
gpt4 key购买 nike

我想在 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 方法被调用了多次。这导致几乎立即多次调用 Treat 方法。这意味着,每个 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。您能否展示更多周围环境,并指出是什么让您认为它不起作用?

关于c# - 如何在 foreach 循环中的每次迭代后进行延迟?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52060331/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com