Случайное исключение Xamarin из измененной коллекции

#xamarin #exception #xamarin.forms #xamarin.android #crash

#xamarin #исключение #xamarin.forms #xamarin.android #сбой

Вопрос:

Я создал простое навигационное приложение, в котором есть несколько экранов, содержащих средства выбора, списки, кнопки и изображения, используя Skia sharp SVG.

Кажется, что все работает правильно, но иногда он случайным образом выдает исключение в любой случайной позиции. Даже когда я оставляю приложение открытым на некоторое время, я получаю то же исключение.

Ошибка, которую оно выдает, является

Коллекция была изменена; операция перечисления может не выполняться «.

Я попытался его отладить. Каждый раз, когда происходит сбой, и появляется следующая трассировка стека:

в системе.Коллекции.Generic.List 1 Enumerator[T].MoveNextRare () [0x00013] in <58604b4522f748968296166e317b04b4>:0
at System.Collections.Generic.List
1 перечислитель [T].MoveNext () [0x0004a] в <58604b4522f748968296166e317b04b4>:0 в Xamarin.Формы.Платформа.Android.VisualElementTracker.Требуется обработка (System.Отправитель объекта, Xamarin.Формы.Внутренние компоненты.EventArg`1[T] e) [0x00022] в D:a1sXamarin .Формы.Платформа.Android VisualElementTracker.cs: 180 в Xamarin.Forms.VisualElement.BatchCommit () [0x0001c] в D:a1sXamarin .Формы.Core VisualElement.cs:581 в Xamarin.Формы.AnimationExtensions.Обработкаweenerfinished (System.Объект o, система.EventArgs аргументы) [0x000cb] в D:a1sXamarin .Формы.Core AnimationExtensions.cs: 276 в Xamarin.Формы.Tweener.b__22_0 (шаг System.Int64) [0x00095] в D:a1sXamarin .Формы.Core Tweener.cs:103 в Xamarin.Формы.Внутренние компоненты.Бегущая строка.Отправка сигналов (шаг System.Int64) [0x0003c] в D:a1sXamarin .Формы.Core Internals Ticker.cs:102 в Xamarin.Формы.Внутренние компоненты.Бегущая строка.Отправка сигналов (System.Int32 timestep) [0x00014] в D:a1sXamarin .Формы.Core Internals Ticker.cs: 91 в Xamarin.Формы.Платформа.Android.AndroidTicker.OnValOnUpdate (System.Отправитель объекта, Android.Анимация.ValueAnimator AnimatorUpdateEventArgs e) [0x00000] в D:a1sXamarin .Формы.Платформа.Android AndroidTicker.cs:71 на Android.Анимация.ValueAnimator IAnimatorUpdateListenerImplementor.OnAnimationUpdate (Android.Анимация.Анимация ValueAnimator) [0x00017] в <2960acf2eeb24d88b5230e1e8afbdc2e>:0 на Android.Анимация.ValueAnimator IAnimatorUpdateListenerInvoker.n_OnAnimationUpdate_Landroid_animation_ValueAnimator_ (System.IntPtr jnienv, System.IntPtr native__this, System.IntPtr native_animation) [0x00011] в <2960acf2eeb24d88b5230e1e8afbdc2e>:0 в (динамический метод оболочки) Android.Время выполнения.DynamicMethodNameCounter.17(intptr, intptr, intptr)

Инструменты:

  • Visual Studio для Mac: 8.0.3 (сборка 14)
  • Разработка Xamarin для Mac: 8.0.2

Тестирование устройств:

  • Samsung Galaxy S9
  • Lenovo Tab 3 7
  • Один плюс 5T

Комментарии:

1. Глядя на стек, кажется, что что-то в вашем коде анимации вызывает проблему. Каков ваш код для анимации форм, которые выполняются?

2. Единственное место, где я использую анимацию, — это поворот моего пользовательского индикатора активности. Его код выглядит следующим образом Task.Run(() => Вращать изображение непрерывно (Circle1, 300)); асинхронная задача вращать изображение непрерывно (SvgXF. Изображение значка, uint timeForOnChunck) { while (isVisible) // a CancellationToken в реальной жизни 😉 { for (int i = 1; i < 7; i ) { если (изображение. Поворот> = 360f) изображения. Поворот = 0; ожидание изображения. RotateTo(i * (360 / 6), timeForOnChunck, ослабление. Линейный); } } }

3. Кстати, спасибо за быстрый ответ и указание направления для изучения проблемы (y)

4. @UmairBhatti Привет, ты решил эту проблему?

5. @JuniorJiang-MSFT Извините за поздний ответ. В моем случае проблема была устранена в том, что я показывал пользовательский индикатор активности на всех страницах, чтобы показать загрузку. В cs этого представления я запускал 3 задачи, чтобы повернуть 3 круга, чтобы показывать непрерывную загрузку с ожиданием в несколько миллисекунд, и никогда не останавливал задачу. По какой-то странной причине, когда я добавил реализацию, которая при исчезновении страницы останавливает все задачи, исправила эту проблему с моей стороны. это странно, но для меня это сработало.

Ответ №1:

В моем случае проблема была устранена в том, что я показывал пользовательский индикатор активности на всех страницах, чтобы показать загрузку. В cs этого представления я запускал 3 задачи, чтобы повернуть 3 круга, чтобы показывать непрерывную загрузку с ожиданием в несколько миллисекунд, и никогда не останавливал задачу. По какой-то странной причине, когда я добавил реализацию, которая при исчезновении страницы останавливает все задачи, исправила эту проблему с моей стороны. это странно, но для меня это сработало.

Комментарии:

1. Привет, у меня похожая анимация загрузки для всех моих страниц, почти тот же код, который вы упомянули в комментариях выше, который будет выполняться с использованием триггеров, и у меня та же проблема. Что вы подразумеваете под «вы никогда не останавливали задачу»? Когда для CancellationToken установлено значение false, цикл while должен прекратить выполнение, и задача будет завершена правильно? Почему мы должны явно останавливать задачу? Можете ли вы также показать мне, как вы остановили задачу из метода OnDisappearing страницы, было бы полезно, если бы это действительно сработало. Заранее спасибо