Как сделать задержку после каждой итерации в цикле foreach? - PullRequest
0 голосов
/ 28 августа 2018

Я хочу добавить задержку после каждой итерации в цикле 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 следует вызывать только один раз . Спасибо за вашу помощь.

1 Ответ

0 голосов
/ 28 августа 2018

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. Не могли бы вы показать больше окружающего контекста и указать, что заставляет вас думать, что оно не работает?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...