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

C# 在foreach循环中,如何在每次迭代后进行延迟?,c#,foreach,C#,Foreach,我想在foreach循环中的每次迭代后添加一个延迟,这样Treat方法只需每2秒调用一次。我不想使用线程。睡眠,因为我想在循环运行时仍能使用我的程序。我试图告诉foreach循环在进行下一次迭代之前等待2秒钟。 以下是我目前掌握的情况: public async void HandlingAsync(ListViewItem woodItem) { IList<ListViewItem> woodList = new List<ListViewI

我想在foreach循环中的每次迭代后添加一个延迟,这样Treat方法只需每2秒调用一次。我不想使用
线程。睡眠
,因为我想在循环运行时仍能使用我的程序。我试图告诉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";
    }
public async void HandlingAsync(ListViewItem woodItem)
{
IList woodList=新列表();
林地列表。添加(林地项目);
foreach(林地列表中的ListViewItem项目)
{
等待任务。延迟(2000);
治疗(项目);
} 
}
公共作废处理(ListViewItem woodItem)
{
woodItem.子项[3].Text=“干燥”;
woodItem.SubItems[4].Text=“确定”;
}
这不起作用,因为
await
命令不影响foreach循环,只影响其中的命令。我可以确认这一点,因为ListView同时更改其所有项目,而它应该更改一个项目,并在更改下一个项目之前等待2秒钟


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

foreach
尊敬
等待
一切顺利;以下是控制台中的一个示例:

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}");
}
我的输出是(带有明显的停顿):


因此:如果您的代码没有按预期运行-问题不在于
foreach
/
wait
。您是否可以显示更多周围的上下文,并指出什么使您认为它不起作用?

您所说的wait命令不影响foreach循环是什么意思?这是执行
线程的异步版本。Sleep
。你从中得到的确切结果是什么?你可以使用
Thread.Sleep(2000)“foreach循环不受wait的影响”-是的,它受影响;确实如此;如果某个东西工作不正常,这很好-但是:
foreach
绝对尊重这里的
wait
您如何确定延迟没有发生?为了解释@WiktorZychla的观点-这里的问题似乎是在这个循环期间暂停重新绘制。您可以使用
DoEvents
强制执行,但是。。。这在很多方面都非常可怕,任何时候你可以避免
DoEvents
,你应该避免
DoEvents
。您确定在循环之前没有显式的“禁用绘制”/“抑制更改”/etc调用吗?我更新了我的问题并添加了一些代码。我的foreach循环将继续,无需等待2秒。我可以看到这一点,因为我的ListView同时更改了它的所有项。@CaramelBailey因此在评论中提出了我的问题,关于是否有一些代码正在禁止UI更新
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