C # Исключение, где емкость ниже, чем количество -- c# поле с участием list пол Связанный проблема

C# Exception where Capacity is lower than Count


0
vote

проблема

русский

Я ударю исключение со списком в C #, когда добавляю элемент в списке. Я не могу видеть ничего конкретного там.

<Код> tempList.ForEach(tempDis => alloc.ListDistribution.Add(tempDis));

Когда я навязываю <код> alloc.ListDistribution , отладчик говорит мне, что в списке есть 6 элементов. Если я попытаюсь расширить эти предметы, у меня есть исключение, которое говорит:

Исходный массив не был достаточно долго. Проверьте srcindex и длину, а нижние границы массива. в System.Array.copy (Array SourCearRay, INT32 SourceIndex, Array TurantArray, INT32 TOUNTERNINGINDEX, INT32 длина, логический надежный) в System.Collections.generic.list <код> 1.CopyTo(T[] array, Int32 arrayIndex) at System.Collections.Generic.Mscorlib_CollectionDebugView 1.get_items ()

И я вижу емкость списка 4, в то время как количество составляет 6. Итак, исключение срабатывает, пока система подразумевает вместимостью.

Пока это не имеет смысла для меня, документация упоминаний в списке исключений, что есть сценарий, где:

Аргументация Емкость аргументов устанавливается на значение, которое меньше, чем количество.

Но в замечаниях указывается, что это не может произойти: Емкость всегда больше или равна считать. Если счет превышает емкость при добавлении элементов, емкость увеличивается путем автоматического перераспределения внутреннего массива перед копированием старых элементов и добавления новых элементов.

Любая идея, что может привести к срабатыванию этого исключения?

Английский оригинал

I'm hitting an exception with a List in C# when I add an item in the list. I can't really see anything specific there.

tempList.ForEach(tempDis => alloc.ListDistribution.Add(tempDis));

When I hover alloc.ListDistribution, the debugger tells me there is 6 items in the list. If I try to expand those items, I have an exception that says:

Source array was not long enough. Check srcIndex and length, and the array's lower bounds. at System.Array.Copy(Array sourceArray, Int32 sourceIndex, Array destinationArray, Int32 destinationIndex, Int32 length, Boolean reliable) at System.Collections.Generic.List1.CopyTo(T[] array, Int32 arrayIndex) at System.Collections.Generic.Mscorlib_CollectionDebugView1.get_Items()

And I can see the Capacity of the list is 4, while the Count is 6. So the exception is triggered while the system is inceasing capacity.

While that makes no sense to me, the documentation of the mentions in the list of Exception that there is a scenario where:

ArgumentOutOfRangeException Capacity is set to a value that is less than Count.

But in the remarks specifies this can't happen: Capacity is always greater than or equal to Count. If Count exceeds Capacity while adding elements, the capacity is increased by automatically reallocating the internal array before copying the old elements and adding the new elements.

Any idea what could cause this exception to be triggered?

</div
     
       
       

Список ответов

1
 
vote

У меня есть несколько поток, они не должны получить доступ к этим данным одновременно, но с целью вопроса, мы должны предполагать, что они делают

Затем исправьте это, <код> List<T> не безрезультатно. Если два потока добавляют или удаляют элементы одновременно, его внутренние счетчики запутываются. Затем материал ломается, когда вы снова доступа к списку, например, используя отладчик для проверки его содержимого, но может произойти, а также, когда следующий кусок кода доступа к нему.

Синхронизация вашего доступа к этому списку.

Это исключение не документировано, потому что использование его в нескольких потоках не является частью его поддерживаемого использования.

 

I do have multiple thread, they shouldn't access this data at the same time but for the purpose of the question, we should assume they do

Then fix that, List<T> isn't thread-safe. If two threads add or remove items at the same time, its internal counters get messed up. Stuff then breaks when you access the list again, such as using the debugger to inspect its contents, but it can happen as well as when the next piece of code accesses it.

Synchronize your access to that list.

This exception isn't documented, because using it in multiple threads is not part of its supported usage.

</div
 
 
 
 
0
 
vote

Вам нужно заблокировать список, если вы собираетесь добавить или удалить объекты в многопоточном контексте. Единственная безопасная резьба в списке является чтение. Кроме того, если вы используете Foreach для итерации по поводу списка, это не должно меняться размера.

 

You need to lock the list if you are going to add or remove objects in a multithread context. The only thread-safe operation on list is reading. Also, if you´re using foreach for iterating over a list, this shouldn't vary it's size.

</div
 
 

Связанный проблема

5  Использование Litjson в Unity3D  ( Using litjson in unity3d ) 
2 вопроса. 1) Можно ли использовать библиотеку Litjson AS так же, как и сценарии в JavaScript? Это действительно общий вопрос о том, чтобы иметь возможность...

1  Получение строки сразу после вставки возвращается нет результата  ( Getting row right after insert returns no result ) 
Я бегут тесты подразделения, и когда я пытаюсь вставить данные в базу данных и получить его сразу после того, как я ничего не получаю (я пробовал с <код> Data...

8  Почему я не могу удалить это cookie?  ( Why cant i delete this cookie ) 
Хорошо, вот 411 - у меня есть следующий обработчик событий в моем файле Global.Asax.cs: <код> private void Global_PostRequestHandlerExecute(object sender, E...

0  WCF Post Method Получить ошибку 400 плохой запрос  ( Wcf post method get error 400 bad request ) 
Я использую метод WCF Post, как только я добавил PARAMETER POST на службу, его ошибка возврата 400 плохой запрос, если я оставил параметр пустой, он может пол...

1  WCF Callback Doblocks даже с «iSineynchronInationContext = False»  ( Wcf callback deadlocks even with usesynchronizationcontext false ) 
Я застрял с проблемой, которую я не могу понять. Проблема связана с синхронизацией между потоками на стороне клиента, но я не могу найти корневую причину эт...

0  Как загрузить каталог на FTP, используя ftplib?  ( How to upload directory to ftp using ftplib ) 
У меня проблемы с загрузкой Все файлы на FTP: я использую ftplib . У меня есть функция для загрузки: <код> Proj executable not found. Please set PROJ_DIR v...

5  сериализовать два разных экземпляра в списке на одну строку JSON  ( Serialize two different instances in a list to a single json string ) 
У меня есть два типа классов: <код> public class HolidayClass { public int ID { get; set; } public string Name { get; set; } public DateTime Sta...

9  DataTable не выпускает память  ( Datatable does not release memory ) 
У меня есть процесс загрузки данных, который загружает большую сумму данных в DataTable, затем выполняет некоторые данные, но каждый раз, когда задание заверш...

0  Соединение не было закрыто. Текущее состояние соединения открыто  ( Connection was not closed connections current state is open ) 
Это дает сообщение об ошибках не было закрыто. Текущее состояние соединения открыто. Пожалуйста, помогите с кодом. <код> private void comboBox1_SelectedIn...

1  Visual Studio C # KeyDown блокирует друг друга  ( Visual studio c sharp keydown blocking each other ) 
Есть ли способ сделать два ключа работать одновременно, поэтому они не блокируют друг друга? <код> private void multiplayer_KeyDown(object sender, KeyEv...

105  Почему C # реализует методы как не виртуальные по умолчанию?  ( Why c sharp implements methods as non virtual by default ) 
В отличие от Java, почему C # методы лечения как не виртуальные функции по умолчанию? Скорее всего, это проблема производительности, а не на других возможных ...

0  Написание одного символа за раз в приложении консоли C #?  ( Writing one character at a time in a c sharp console application ) 
Я не уверен, как это объяснить ... В основном я хочу иметь возможность писать строки текста в консоли, как старые RPG, используемые для записи диалога, один...

0  Создание ссылки IPC между плагинами APC Java и C #  ( Establishing ipc link between a java app and c based plugins ) 
У нас есть приложение Java, а также ряд плагинов C #, для других приложений (например, Excel), которые могут взаимодействовать с основным приложением. Слой св...

0  Анимация спрайты в XNE после мыши  ( Sprite animation in xna following the mouse ) 
Моя старая проблема заключалась в том, что мой код изначально следит за мышью, но когда она достигла мыши, она исчезла, и в конечном итоге исчезла. Моя теку...

0  Не читайте текстовые данные на таблицу SQL в C #  ( Not reading text data to sql table in c sharp ) 
Поэтому я следовал большему количеству помощи, которую я мог найти здесь. Я создал программу C #, которая читает из текстового файла и вставляет в таблицу баз...




© 2021 www.qaru.top All Rights Reserved. Q&A House все права защищены


Licensed under cc by-sa 3.0 with attribution required.