Распараллеливание списка

369
09 декабря 2016, 08:46

Добрый день. У меня возникла следующая задача: я получаю список строк, после этого создаю экземпляр класса и вызываю в нём метод. На данный момент нужно сделать распараллеливание этого списка, то есть, обработка в разных потоках. Одновременно может выполняться определённое количество потоков. Как только один закончил - запускается следующий, и так до самого конца. Я бы сделал на Parallel.Foreach, но проблема в том, что нужно сделать именно на async/await. Информацию по ним я находил, но понять, как с ними работать, до конца не могу, ибо мне проще понимать чтением кода. Прошу помощи.

Answer 1

Например, должно сработать такое.

async Task ProcessTasks(IEnumerable<string> data, int maxParallelTasks)
{
    var runningTasks = new HashSet<Task>();
    foreach (var s in data) // цикл по всем строкам
    {
        // дождёмся, когда найдётся «место» для нового задания
        while (runningTasks.Count >= maxParallelTasks)
        {
            // дождёмся окончания задания
            var firstFinishedTask = await Task.WhenAny(runningTasks);
            await firstFinishedTask; // доставим возможное исключение сюда
            runningTasks.Remove(firstFinishedTask);
        }
        // стартуем новое задание
        runningTasks.Add(Task.Run(() => ProcessData(s));
    }
    // дождёмся окончания всех запущенных заданий
    foreach (var task in runningTasks)
        await task;
}

Если отбросить жёсткое ограничение на количество одновременных заданий, и доверить планировку выполнения TPL, подойдёт более простой код:

var tasks = data.Select(s => Task.Run(() => ProcessData(s))).ToList();
await Task.WhenAll(tasks);
READ ALSO
html Как обрезать ссылку

html Как обрезать ссылку

Имеется строка:

421
Как очистить errorprovider через заданный timeout?

Как очистить errorprovider через заданный timeout?

Есть 10 контролов, есть один errorproviderЕсли в контроле нет текста, появляется сообщение типа

356
c# String hex в int hex

c# String hex в int hex

Есть строка

301
C# WPF Как правильно привязать Combo box к сущности?

C# WPF Как правильно привязать Combo box к сущности?

В комментариях привёл ссылку,где отвечают на мой вопрос,но я не понимаю как он привязывает выбранную сущность в combobox к нужной сущности(Stelug...

535