C# Параллельный цикл For с минутной задержкой

У меня есть очень простой цикл for, который выглядит так

for(int i = 0; i< 26; i++)
{
    DoSomething(i);
}

Выполнение функции DoSomething занимает около 3 минут. Я хочу написать цикл for, который вызывает DoSomething() каждую минуту, не дожидаясь завершения предыдущего вызова. Я пытался сделать что-то вроде этого:

Parallel.For(0, 26, i =>
{
    DoSomething(i);
    System.Threading.Thread.Sleep(60000);
}

Но это не работает, так как сначала делает вызов, а затем спит. Обращение шагов также означает, что метод DoSomething вызывает огонь без задержки между каждым вызовом. Как настроить так, чтобы вызов DoSomething был каждую минуту?

Спасибо!


person Matt Kagan    schedule 28.05.2015    source источник


Ответы (2)


Вы можете использовать Task.Delay, который внутренне использует объект Timer:

public async Task DoSomethingAndWaitAsync()
{
    int i = 0
    while (i < 26)
    {
        Task.Run(() => DoSomething(i));
        await Task.Delay(TimeSpan.FromMinutes(1));

        i++;
    }
}

Или, если вы хотите сохранить цикл for:

public async Task DoSomethingAndWaitAsync()
{
    for (int i = 0; i < 26; i++)
    {
        Task.Run(() => DoSomething(i));
        await Task.Delay(TimeSpan.FromMinutes(1));
    }
}
person Yuval Itzchakov    schedule 28.05.2015
comment
@YuvalItzchakov Можете ли вы помочь мне с этим: stackoverflow.com/questions/55026042/ - person Prashant Pimpale; 11.03.2019

person    schedule
comment
Считаете ли вы это пустой тратой потока, зависит от контекста, и добавление async/await по мере необходимости тривиально. - person glenebob; 28.05.2015