#c# #ios #xamarin.forms
Вопрос:
- Версия форм Xamarin : 4.8.0.1560
- Происходит для нескольких версий iOS
- iPhone и iPad
Сбой происходит периодически и происходит в производственном выпуске для 12 % от общего числа пользователей.
аналитика сбоев firebase показывает нижеприведенную строку в качестве точки сбоя, и список никогда не бывает пустым или пустым
try { foreach (var item in ViewModel?.availableList?.anotherList?.GetRange(0, 2)) } catch (Exception ex) { do something}
Вы, ребята, думаете, что глубокое копирование и последующая итерация помогут?
Примечание :
- Я пока не могу воспроизвести его сам.
- Я также проверил, что список не обновляется ни из каких других потоков
Полный журнал
Crashed: tid_407
0 someNameSpace.iOS 0x1047ac840 someNameSpace._Views_view._Addpocket 386 (view..xaml.cs:386)
1 someNameSpace.iOS 0x1047ab204 someNameSpace._Views_view._Displaypocket 174 (view..xaml.cs:174)
2 someNameSpace.iOS 0x1047ab204 someNameSpace._Views_view._Displaypocket 174 (view..xaml.cs:174)
3 someNameSpace.iOS 0x1047e2c08 someNameSpace._Views_view.___ctorb__9_5_string 57 (view..xaml.cs:57)
4 someNameSpace.iOS 0x103538880 wrapper_runtime_invoke_object_runtime_invoke_dynamic_intptr_intptr_intptr_intptr 4342433920
5 someNameSpace.iOS 0x10558b21c mono_jit_runtime_invoke 3165 (mini-runtime.c:3165)
6 someNameSpace.iOS 0x105646940 mono_runtime_invoke_checked 3052 (object.c:3052)
7 someNameSpace.iOS 0x10564e214 mono_runtime_try_invoke_array 5626 (object.c:5626)
8 someNameSpace.iOS 0x1055efcec ves_icall_InternalInvoke 3927 (icall.c:3927)
9 someNameSpace.iOS 0x105600f50 ves_icall_InternalInvoke_raw 667 (icall-def.h:667)
10 someNameSpace.iOS 0x103301808 wrapper_managed_to_native_System_Reflection_RuntimeMethodInfo_InternalInvoke_System_Reflection_RuntimeMethodInfo_object_object___System_Exception_ 4340111368
11 someNameSpace.iOS 0x1033019b0 System_Reflection_RuntimeMethodInfo_Invoke_object_System_Reflection_BindingFlags_System_Reflection_Binder_object___System_Globalization_CultureInfo 4340111792
12 someNameSpace.iOS 0x1032ef48c System_Reflection_MethodBase_Invoke_object_object__ 4340036748
13 someNameSpace.iOS 0x10369259c Xamarin_Forms_MessagingCenter_Subscription_InvokeCallback_object_object 95 (MessagingCenter.cs:95)
14 someNameSpace.iOS 0x103691974 Xamarin_Forms_MessagingCenter_InnerSend_string_System_Type_System_Type_object_object 213 (MessagingCenter.cs:213)
15 someNameSpace.iOS 0x1036910d4 Xamarin_Forms_MessagingCenter_Xamarin_Forms_IMessagingCenter_Send_TSender_REF_TSender_REF_string 128 (MessagingCenter.cs:128)
16 someNameSpace.iOS 0x103691078 Xamarin_Forms_MessagingCenter_Send_TSender_REF_TSender_REF_string 121 (MessagingCenter.cs:121)
17 someNameSpace.iOS 0x1045837e0 someNameSpace._ViewModels_view.Model__GetpocketInfod__23_MoveNext 177 (view.Model.cs:177)
18 someNameSpace.iOS 0x1032df31c System_Runtime_CompilerServices_AsyncMethodBuilderCore_MoveNextRunner_InvokeMoveNext_object 4339970844
19 someNameSpace.iOS 0x10325f8fc System_Threading_ExecutionContext_RunInternal_System_Threading_ExecutionContext_System_Threading_ContextCallback_object_bool 4339448060
20 someNameSpace.iOS 0x10325f6fc System_Threading_ExecutionContext_Run_System_Threading_ExecutionContext_System_Threading_ContextCallback_object_bool 4339447548
21 someNameSpace.iOS 0x1032df1d8 System_Runtime_CompilerServices_AsyncMethodBuilderCore_MoveNextRunner_Run 4339970520
22 someNameSpace.iOS 0x10327f264 System_Threading_Tasks_AwaitTaskContinuation_InvokeAction_object 4339577444
23 someNameSpace.iOS 0x10327f394 System_Threading_Tasks_AwaitTaskContinuation_RunCallback_System_Threading_ContextCallback_object_System_Threading_Tasks_Task_ 4339577748
24 someNameSpace.iOS 0x10327e5ac System_Threading_Tasks_SynchronizationContextAwaitTaskContinuation_Run_System_Threading_Tasks_Task_bool 4339574188
25 someNameSpace.iOS 0x103278740 System_Threading_Tasks_Task_FinishContinuations 4339550016
26 someNameSpace.iOS 0x103276b90 System_Threading_Tasks_Task_FinishStageThree 4339542928
27 someNameSpace.iOS 0x103271ab4 System_Threading_Tasks_Task_1_TResult_REF_TrySetResult_TResult_REF 4339522228
28 someNameSpace.iOS 0x1032dd98c System_Runtime_CompilerServices_AsyncTaskMethodBuilder_1_TResult_REF_SetResult_TResult_REF 4339964300
29 someNameSpace.iOS 0x1045cbcf8 someNameSpace._Repo_FoodieClubRepo__Getpocketd__18_MoveNext 126 (FoodieClubRepo.cs:126)
30 someNameSpace.iOS 0x1032df31c System_Runtime_CompilerServices_AsyncMethodBuilderCore_MoveNextRunner_InvokeMoveNext_object 4339970844
31 someNameSpace.iOS 0x10325f8fc System_Threading_ExecutionContext_RunInternal_System_Threading_ExecutionContext_System_Threading_ContextCallback_object_bool 4339448060
32 someNameSpace.iOS 0x10325f6fc System_Threading_ExecutionContext_Run_System_Threading_ExecutionContext_System_Threading_ContextCallback_object_bool 4339447548
33 someNameSpace.iOS 0x1032df1d8 System_Runtime_CompilerServices_AsyncMethodBuilderCore_MoveNextRunner_Run 4339970520
34 someNameSpace.iOS 0x10327ea08 System_Threading_Tasks_SynchronizationContextAwaitTaskContinuation__c___cctorb__7_0_object 4339575304
35 someNameSpace.iOS 0x104174c6c Foundation_NSAsyncSynchronizationContextDispatcher_Apply 178 (NSAction.cs:178)
36 someNameSpace.iOS 0x103538880 wrapper_runtime_invoke_object_runtime_invoke_dynamic_intptr_intptr_intptr_intptr 4342433920
37 someNameSpace.iOS 0x10558b21c mono_jit_runtime_invoke 3165 (mini-runtime.c:3165)
38 someNameSpace.iOS 0x105646940 mono_runtime_invoke_checked 3052 (object.c:3052)
39 someNameSpace.iOS 0x10564a1a4 mono_runtime_invoke 3107 (object.c:3107)
40 someNameSpace.iOS 0x10310d3c8 native_to_managed_trampoline_11(objc_object*, objc_selector*, _MonoMethod**, unsigned int) 408 (registrar.m:408)
41 someNameSpace.iOS 0x103113f8c -[__MonoMac_NSAsyncSynchronizationContextDispatcher xamarinApplySelector] 9024 (registrar.m:9024)
42 Foundation 0x1966b7b90 __NSThreadPerformPerform 188
43 CoreFoundation 0x19529d76c __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION__ 28
44 CoreFoundation 0x19529d668 __CFRunLoopDoSource0 208
45 CoreFoundation 0x19529c9cc __CFRunLoopDoSources0 376
46 CoreFoundation 0x195296a8c __CFRunLoopRun 824
47 CoreFoundation 0x19529621c CFRunLoopRunSpecific 600
48 GraphicsServices 0x1ace60784 GSEventRunModal 164
49 UIKitCore 0x197cd6ee8 -[UIApplication _run] 1072
50 UIKitCore 0x197cdc75c UIApplicationMain 168
51 someNameSpace.iOS 0x1041e7ca8 wrapper_managed_to_native_UIKit_UIApplication_UIApplicationMain_int_string___intptr_intptr 4355734696
52 someNameSpace.iOS 0x10411d6d0 UIKit_UIApplication_Main_string___intptr_intptr 86 (UIApplication.cs:86)
53 someNameSpace.iOS 0x10411d654 UIKit_UIApplication_Main_string___string_string 66 (UIApplication.cs:66)
54 someNameSpace.iOS 0x103141e64 someNameSpace._iOS_Application_Main_string__ 1 (<unknown>:1)
55 someNameSpace.iOS 0x103538880 wrapper_runtime_invoke_object_runtime_invoke_dynamic_intptr_intptr_intptr_intptr 4342433920
56 someNameSpace.iOS 0x10558b21c mono_jit_runtime_invoke 3165 (mini-runtime.c:3165)
57 someNameSpace.iOS 0x105646940 mono_runtime_invoke_checked 3052 (object.c:3052)
58 someNameSpace.iOS 0x10564cb98 mono_runtime_exec_main_checked 5178 (object.c:5178)
59 someNameSpace.iOS 0x1055697b0 mono_jit_exec 1383 (driver.c:1383)
60 someNameSpace.iOS 0x105727350 xamarin_main 493 (monotouch-main.m:493)
61 someNameSpace.iOS 0x10313de40 main 190 (main.m:190)
62 libdyld.dylib 0x194f566b0 start 4
Ответ №1:
Не вводите код xx?.method()
foreach
, это опасно.
Если xx
равно null , то xx?.method()
равно null , поэтому следующий код, например
foreach (var item in null)
{
}
Послушно приложение рухнет .
И для другого сценария : если количество xx
меньше 2, приложение выдаст OutOfbounds
исключение.
Правильный и безопасный код
var list = ViewModel?.availableList?.anotherList;
if(list != null and list.Count>=2){
var newList = list.GetRange(0, 2);
foreach (var item in newList){}
}
Другой способ-поместить исходный код в try-catch
.
Комментарии:
1. Спасибо @Colex — MSFT, текущий код находится в try/catch. Список не является нулевым. Я думал о том же, чтобы сначала получить глубокую копию списка из 2 пунктов, а затем поработать над ним, но не был уверен, поможет ли это.
var list = (deep copy) ViewModel?.availableList?.anotherList.get 2 items ;
2. Вы имеете в виду, что сбой все равно произойдет, даже если поместить код в try/catch ? И как вы реализуете глубокое копирование в этом сценарии ?
3. Да, сбой происходит даже после попытки поймать. Теперь мы реализовали глубокое копирование с помощью . ToList(), я обновлю здесь, как только получу результат от производства.
4. Конечно, это прекрасно .
Ответ №2:
Выполнение глубокого копирования вместо использования getRange решило эту проблему.