×

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

Підписуйтеся на Telegram-канал «DOU #tech», щоб не пропустити нові технічні статті

        public static async void  Beg ()
        {
            string begin = @"
                               <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 — просто возвращает обработанную строку.

Подскажите что делать.

👍ПодобаєтьсяСподобалось0
До обраногоВ обраному0
LinkedIn
Дозволені теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter
Дозволені теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter

лист потоконебезопасный.
поменял лист на ConcurrentBag cb = new ConcurrentBag(); и все работает как часы

я конечно не знаю имплементации Лист в .нет, но вас не смущает что вы пишите в несинхронизированный объект паралельно????????????

проверил доку, инфы о том что Лист синхронизирован нет.
насколько я понимаю вы хотите ранить ГетРекород паралельно, значит для каждого треда нужен свой лист который аккумулирует значения, а после выполнения сливать все в один лист но уже в главном треде

в дотнете 4 + это уже все сделанно. Надо было найти решение.

спасибо, буду знать о ConcurrentBag )))

да и вообще Concurrent* там разные есть на подобные случаи

Підписатись на коментарі