我想在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 仅应被称为一次。感谢您的帮助。
答案 0 :(得分:4)
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
造成的。您能否显示更多周围的环境,并指出是什么让您认为它不起作用?