Ограничение на длину List внутри Parallel.For

Рейтинг: 1Ответов: 1Опубликовано: 15.01.2023

Мне нужно выполнить итерацию от 1 до 1млн. Сгруппировать их до 1000 и отправить в метод. Чтобы повысить производительность, я использую Parallerl.for. Суть вопроса заключается в том, что бывают случаи, когда условие _user Ids.Count==1000 не выполняется, потому что его длина уже больше 1000. Вот код:

            var _usrsIds = new ConcurrentBag<long>();
            Console.WriteLine($"{DateTime.Now.ToLocalTime()}:Start");
            Parallel.For(1, 1000000000, usrId =>
             {
                if (_usrsIds.Count == 1000)
                    AddUsersToDB(_usrsIds);
                else
                {
                    lock (this)
                    {
                        _usrsIds.Add(usrId);
                    }
                }         
            });
            Console.WriteLine($"{DateTime.Now.ToLocalTime()}:End");

Ответы

▲ 1Принят

Вы как то неправильно используете parallel.for - он для каких то осязаемых задач существует, а не для простого инкремента.

Если так надо прямо генерить по 1000 штук, можно поступить проще, не блокируя ничего нигде, пример

Parallel.For(0, 1000000, prefix =>
    {
        var list = new List<int>();
        for (int i = 0; i < 1000; i++) list.Add(prefix * 1000 + i);
        AddUsersToDB(list);
    });

Как избавиться от элемента с id=0, думаю, сами догадаетесь =)