Dot-Net

Android Xamarin 應用程序中 System.Threading.Tasks.RangeWorker.FindNewWork 中的 NullReferenceException

  • September 4, 2018

在使用 Xamarin 創建的 Android 本機應用程序中,我在 HockeyApp 中收到以下崩潰報告:

Xamarin caused by: android.runtime.JavaProxyThrowable: System.NullReferenceException: Object reference not set to an instance of an object
 at System.Threading.Tasks.RangeWorker.FindNewWork (System.Int64& nFromInclusiveLocal, System.Int64& nToExclusiveLocal) [0x00000] in <8f1acca5a43d45c5b8d35add5a11806a>:0 
 at System.Threading.Tasks.RangeWorker.FindNewWork32 (System.Int32& nFromInclusiveLocal32, System.Int32& nToExclusiveLocal32) [0x00000] in <8f1acca5a43d45c5b8d35add5a11806a>:0 
 at System.Threading._ThreadPoolWaitCallback.PerformWaitCallback () <0xec919968 + 0x00033> in <8f1acca5a43d45c5b8d35add5a11806a>:0

我無法弄清楚是什麼導致了這個異常,因為堆棧跟踪只包含 .net 程式碼。我查看了框架的原始碼,看看我是否能理解它,但無濟於事。

我還在我的收藏夾搜尋引擎中嘗試了許多不同的搜尋,但沒有找到任何關於類似問題的文章/文章。

從與這些崩潰相關的數據來看,這似乎是僅在三星設備(S8、S8+ 和 Note8)上發生的問題。我不能 100% 確定它不會影響其他設備,但我只有這些設備的崩潰報告。

知道什麼可能導致這些崩潰嗎?我線上程方面做錯了什麼,也許是取消令牌?有沒有我沒有正確處理的情況?

任何有助於進一步解決此問題的幫助都將受到歡迎。

謝謝

編輯:

我知道沒什麼可做的,但這是我在 HockeyApp 中獲得的唯一堆棧跟踪,我無法重現,我不知道是什麼程式碼導致了這種情況。

當我自己不管理執行緒時,我正在尋找更多關於什麼可能導致 Mono 執行緒程式碼具有空引用異常的線索。或者這個堆棧跟踪只是一個紅鯡魚,我需要在其他地方尋找?

引起我注意的是 FindNewWork32 呼叫——.NET 實現的連結。您的應用程序可能編譯為 32 位架構,而您提到的那些三星設備具有 64 位處理器。

這篇 Microsoft 論文展示瞭如何將應用程序定位到一個或多個 Android 支持的 CPU 架構。您可能需要針對多個平台:

要針對多個 CPU 架構,您可以選擇多個 ABI(以較大的 APK 文件大小為代價)。您可以使用 Generate one package (.apk) per selected ABI 選項(在設置打包屬性中描述)為每個支持的架構創建單獨的 APK。

您不必選擇 arm64-v8a 或 x86_64 來定位 64 位設備;在 64 位硬體上執行您的應用程序不需要 64 位支持。例如,64 位 ARM 設備(例如 Nexus 9)可以執行為 armeabi-v7a 配置的應用程序。啟用 64 位支持的主要優點是使您的應用程序可以處理更多記憶體。

引用自:https://stackoverflow.com/questions/52047050