Я хочу добавить задержку после каждой итерации в цикле 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 секунды, прежде чем менять следующий элемент.
РЕДАКТИРОВАТЬ : Марк Гравелл прав. Цикл foreach полностью соблюдает команду await
. Так что его ответ работает на 100%. Моя проблема не была ни в цикле foreach, ни в команде await
. Это не сработало, потому что мой HandlingAsync метод вызывался несколько раз. Это приводит к тому, что метод Treat вызывается почти сразу несколько раз. Это означает, что все woodItem были изменены одновременно с задержкой в 2 секунды. Чтобы решить эту проблему, HandlingAsync следует вызывать только один раз . Спасибо за вашу помощь.