C#: Запуск Tasks в цикле [дубликат]

218
11 сентября 2018, 09:20

На данный вопрос уже ответили:

  • Ошибка индекса c# 1 ответ

Код:

    Task<RequestBodyModelDC>[] relatedObjectMapping = new Task<RequestBodyModelDC>[fields.Columns.Count];
    for (int i = 0; i < relatedObjectMapping.Count(); i++)
    {
        Task<RequestBodyModelDC> currTask = new Task<RequestBodyModelDC>(() =>
        {
            return FillMappingObkect(i, fields, entity);
        });
        relatedObjectMapping[i] = currTask;
        relatedObjectMapping[i].Start();
    }

Проблема в том, что в currTask каждый раз попадают последние данные из коллекции relatedObjectMapping, соответственно идет дублирование данных.

Подскажите, пожалуйста, как сделать так,чтобы в цикле при создании Таски в нее передавались актуальное значение параметра "i" в функцию FillMappingObkect!

Спасибо

Answer 1

Проблема в захвате переменной. Просто создайте переменную с ограниченной областью видимости и на каждой итерации цикла она будет своя:

for (int i = 0; i < relatedObjectMapping.Count(); i++)
{
    int localI = i;
    // Дальше везде используем localI вместо i
READ ALSO
Чем плох перехват всех исключений разом?

Чем плох перехват всех исключений разом?

Является ли антипаттерном перехват всех исключений разом?

186
Добавление данных в БД Entity Framework

Добавление данных в БД Entity Framework

Проблема с добавление данных в БД с ипользованием Entity Framework, никак не могу понять причину, почему после добавления в БД записи с неуникальным...

214
Лишний Insert уже существующего объекта в БД (Postgresql)

Лишний Insert уже существующего объекта в БД (Postgresql)

Есть приложение WPF (паттерн MVVM) с двумя окнами (Авторизация и главное окно

172
C#. Нажать на input в браузере

C#. Нажать на input в браузере

Доброго времени суток!

211