Запуск задач в цикле foreach использует значение последнего элемента [дубликат]

На этот вопрос уже есть ответ здесь:

Я делаю первую попытку поиграть с новые Задачи, но что-то происходит, чего я не понимаю.

Во-первых, код, который довольно прост. Я передаю список путей к некоторым файлам изображений и пытаюсь добавить задачу для обработки каждого из них:

public Boolean AddPictures(IList paths)
{
    Boolean result = (paths.Count > 0);
    List tasks = new List(paths.Count);

    foreach (string path in paths)
    {
        var task = Task.Factory.StartNew(() =>
            {
                Boolean taskResult = ProcessPicture(path);
                return taskResult;
            });
        task.ContinueWith(t => result &= t.Result);
        tasks.Add(task);
    }

    Task.WaitAll(tasks.ToArray());

    return result;
}

Я обнаружил, что если я просто позволю этому запускаться, скажем, со списком из 3 путей в модуле test, все три задачи используют последний путь в предоставленном списке. Если я перейду (и замедлю обработку цикла), будет использован каждый путь из цикла.

Кто-нибудь может объяснить, что происходит и почему? Возможные обходные пути?

46
задан abatishchev 14 March 2017 в 02:02
поделиться