Sqlite Xamarin与AzureMobileServices的脱机同步:初始脱机加载速度非常慢

Sqlite Xamarin与AzureMobileServices的脱机同步:初始脱机加载速度非常慢,sqlite,asynchronous,xamarin.forms,azure-mobile-services,offline-caching,Sqlite,Asynchronous,Xamarin.forms,Azure Mobile Services,Offline Caching,我成功地使用Azure移动服务和Xamarin表单在Azure托管的SQL DB上执行CRUD操作。脱机同步部分将数据存储在手机的SQLite db中。在让它像现在这样顺利运行的过程中,我们遇到了一些困难,但这仍然是最后一个障碍 问题 当设备没有连接时,在各种物理和模拟设备上使用飞行模式进行测试-第一次访问任何脱机数据时,返回任何内容都需要很长时间。如果数据是否存在于SQLite数据库中,则会出现这种情况 没有抛出异常,或者我可以看到的任何东西都打印到日志中,指示延迟可能是什么 给出一个想法,2

我成功地使用Azure移动服务和Xamarin表单在Azure托管的SQL DB上执行CRUD操作。脱机同步部分将数据存储在手机的SQLite db中。在让它像现在这样顺利运行的过程中,我们遇到了一些困难,但这仍然是最后一个障碍

问题 当设备没有连接时,在各种物理和模拟设备上使用飞行模式进行测试-第一次访问任何脱机数据时,返回任何内容都需要很长时间。如果数据是否存在于SQLite数据库中,则会出现这种情况

没有抛出异常,或者我可以看到的任何东西都打印到日志中,指示延迟可能是什么

给出一个想法,20行上的PullAsync在联机时可能需要5秒钟,并且该数据存储到SQLite DB。将设备置于脱机模式后,同样的操作可能需要60秒。这些数字相当随意,但延迟明显太长

此外,这种长时间加载只在第一次调用任何脱机同步方法时发生。在那之后,正如我所期望的那样,每一种方法都是近乎即时的——但为什么不是第一次呢

预期结果 我认为,由于数据已经存储在设备上,并且无法检测到互联网连接,因此它几乎可以立即返回数据

密码 同步类

GetPolicys方法是发生延迟的地方。 这是其中一个组件的示例。其他每个组件都是相同的格式,但数据不同

IMobileServiceSyncTable policyTable=SyncController.policyTable; 公共异步任务GetPolicyString companyId { //信号量lim 等待SyncController.dbOperation.WaitAsync; 尝试 { 等待SyncController。初始化; 等待policyTable.PullAsyncpolicy_过程,policyTable.Wherep=>p.fk_company_id==companyId.Wherep=>p.signature!=null | | p.signature!=; return wait policyTable.ToListAsync; } 捕获异常 { //由于某种原因,当调用此方法且设备脱机时,它将落入此catch块。 //我假设这是离线同步的标准,因为它试图在没有连接的情况下进行拉取,导致拉取失败。 //通过使用断点,延迟甚至在到达此catch语句之前就发生了。 Console.WriteLineex; return wait policyTable.ToListAsync; } 最后 { SyncController.dbOperation.Release; } } 同步控制器

公共静态信号量lim dbOperation=新信号量lim1,1; 公共静态移动服务客户端; 公共静态移动服务SqliteStore商店; 公共静态异步任务初始化 { 尝试 { //此行不是脱机同步的标准行。 //插件返回设备当前连接的true或false。 //这是我的尝试,看看是否有连接,以消除加载时间。 //这会立即将其带回GetPolicys中的try语句 如果!CrossConnectivity.Current.IsConnected 回来 如果客户端?.SyncContext?.IsInitialized??错误 回来 客户端=新的MobileServiceClientAppSettings.azureUrl; var path=local.db;//通常使用公司ID, path=path.CombineMobileServiceClient.DefaultDatabasePath,路径; store=新的MobileServiceSQLiteStorepath; /************************/ 本地SQLite数据库中的区域表定义 //定义sqlite数据库中的所有表 .. store.DefineTable; …末端区域 等待client.SyncContext.InitializeAsyncstore; /************/ 区域脱机同步表 .. policyTable=client.GetSyncTable; …末端区域 } 捕获异常 { Console.WriteLineex } } 我试过的 嗯,我甚至不太确定是什么导致了这种情况,所以我的大多数尝试都是在等待时间发生之前强制执行异常,这样它就可以从GetPolicys try catch中消失,因为等待时间似乎在PullAsync上


我最近的一次尝试在SyncController上面的代码中进行了注释,我使用James Montemagno的代码来检测手机的网络连接。我已经分别对此进行了测试,它可以立即正常工作。

简而言之,如果设备处于脱机状态,您不希望在GetPolicys方法中调用PullAsync。例如,你可以< /p>
但您还需要处理这样的情况:这是应用程序第一次运行,因此您还没有任何记录。

非常感谢Eric,我能够用它解决我的问题。我没有在每个sync类中实现它,而是在initialize中的try/catch的最后一部分中进行了检查。在同步类本身中成功捕获了异常。非常感谢!大家好@Eric Hedstrom-接下来,还有什么其他原因可能会导致非常缓慢的ToListSync吗?在上述解决方案已经到位的情况下,我们偶尔会看到任何列表的第一次加载花费了不合理的时间。此加载完成后,任何其他列表在脱机状态下的后续加载都会立即发生。
    try
    {
        await SyncController.Initialize();
        if (CrossConnectivity.Current.IsConnected)
        {
            await policyTable.PullAsync("policy_procedure", policyTable.Where(p => p.fk_company_id == companyId).Where(p=> p.signature!=null || p.signature!=""));
        }
        return await policyTable.ToListAsync();
    }