Существует множество потоков, работающих с этими элементами управления, между использованием Task.Start
и затем BeginInvoke
при удалении элементов, в котором также используется отдельный поток.
В результате очень трудноскажите, произойдет ли то, что происходит в коде, в ожидаемом порядке.Вы можете найти предмет, который хотите удалить, на третьей позиции, но перед тем, как убрать его, удаляется другой предмет, а теперь тот, который вы собирались удалить, находится на второй позиции, а на третьей позиции нет ничего, что дало бы вам ArgumentOutOfRangeException
.
При возникновении подобных проблем с потоками очень часто они возникают непоследовательно.Это может объяснить, почему ошибка возникает «иногда».
Один из способов исправить это - убедиться, что вы не выполняете ни одну из этих трех вещей одновременно:
- Добавление строк
- Цикл по строкам и выяснение, какие из них удалить
- Удаление строк
Вы можете решить эту проблему, используя lock
, чтобы гарантировать, что только одиниз этих вещей происходит одновременно.
Кроме того, вместо удаления строк, когда вы найдете строки для удаления, создайте список строк, а когда закончите, удалите их все сразу, стараясь всегда удалятьих в порядке убывания.В противном случае, если вы попытаетесь удалить строку 10, за которой следует строка 11, после удаления строки 10 строка, которая была в 11, теперь равна 10. Теперь, если вы удаляете 11, вы удаляете ту, которая была в 12. Или нет 11 иВы снова получаете исключение.