You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Xamarin升级后出现FindAccountsForServiceAsync空引用异常求助

排查并解决FindAccountsForServiceAsync空引用异常

针对你升级Xamarin环境后新增定时器出现的System.NullReferenceException异常,我整理了几个关键排查方向和解决办法:

1. 检查AccountStore实例是否正确初始化

空引用最常见的原因就是调用方法的对象本身为null。你需要确认在定时器的StartTimers方法中,调用FindAccountsForServiceAsync的AccountStore实例是否已正确获取:

// 正确的AccountStore获取方式
var accountStore = AccountStore.Create();
if (accountStore == null)
{
    // 这里说明获取失败,需要排查环境或权限问题
    Console.WriteLine("AccountStore实例获取失败");
    return;
}
var accounts = await accountStore.FindAccountsForServiceAsync("你的服务标识");

如果是在定时器回调中才获取AccountStore,要注意定时器线程的上下文是否支持AccountStore的创建——部分定时器(比如System.Timers.Timer)会在后台线程触发回调,而Xamarin.iOS的某些API对线程上下文有要求,建议切换到主线程执行相关操作:

// 在定时器回调中切换到主线程
Device.BeginInvokeOnMainThread(async () => 
{
    var accountStore = AccountStore.Create();
    if (accountStore != null)
    {
        var accounts = await accountStore.FindAccountsForServiceAsync("你的服务标识");
        // 后续逻辑
    }
});

2. 验证Xamarin.iOS 13.x的API兼容性

你升级到了Xamarin.iOS 13.2.0.47,这个版本对Account相关的API有一些权限和行为变更:

  • 确保你的Info.plist中已添加对应的权限描述(比如NSAccountsUsageDescription),缺少权限可能导致AccountStore无法正常初始化
  • 检查FindAccountsForServiceAsync的参数是否正确,服务标识是否和之前一致,拼写错误也可能导致内部逻辑返回null进而引发异常

3. 排查定时器的触发时机

如果StartTimers方法在应用启动早期就被调用(比如在AppDelegate.FinishedLaunching中还未完成所有初始化时),此时AccountStore依赖的系统服务可能还未就绪,导致获取实例失败。建议:

  • 延迟定时器的启动时间,比如在页面加载完成后再调用StartTimers
  • 添加初始化完成的标记,确保在所有依赖服务就绪后再触发定时器回调

4. 检查Mono环境的潜在问题

你当前使用的Mono 6.4.0.208存在一些已知的线程上下文相关bug,可能影响异步方法的执行。可以尝试:

  • 更新Mono到对应VS2019 16.3.3支持的最新稳定版本
  • 在调用异步方法前,确保SynchronizationContext已正确设置

内容的提问来源于stack exchange,提问作者A.Goutam

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 08:12:26