struggleendlessly
@struggleendlessly
.net Senior developer

Почему пропадают значения при паралельной обработке масива в C#?

public static async void  Beg ()
        {
            string begin = @"<?xml version=""1.0"" encoding=""utf-8"" standalone=""yes"" ?>
                               <fellow_update_facility>";
            string end = @"</fellow_update_facility>";

            int CCountOfUserd = 10000;
            int length1 = 0;
            List<string> zxc = new List<string>();
            IEnumerable<int> items = Enumerable.Range(20000, CCountOfUserd);

            items.AsParallel().ForAll(async item =>
            {
                Interlocked.Increment(ref length1);
                //string ddd = await Task.Run(() => GetRecord(item));
                zxc.Add(await Task.Run(() => GetRecord(item)));
            });

            if (zxc.Count == CCountOfUserd)
            {
                System.IO.File.WriteAllText(@"D:\FDD Update File 1 20150304.xml", begin + string.Join(",", zxc.ToArray()) + end);
            }
        }


Так вот на выходе zxc.Count == CCountOfUserd количество записей не совпадает с количеством обработанных элементов массива. Количество обработанных элементов массива в length1 смотрю . У меня 8 потоковый проц и прирост больше чем в 10 раз, но надо что б все было правильно.

Метод GetRecord - просто возвращает обработанную строку.

Подскажите что делать.
  • Вопрос задан
  • 155 просмотров
Решения вопроса 1
struggleendlessly
@struggleendlessly Автор вопроса
.net Senior developer
лист потоконебезопасный.
поменял лист на ConcurrentBag cb = new ConcurrentBag(); и все работает как часы
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы