获取数据的 Xamarin 离线同步问题

Xamarin Offline Sync issue with getting data

我在使用 android 模拟器从 Azure 移动后端 api 返回数据时遇到一些问题。移动应用程序是用 Xamarin 编写的,我使用的是 MobileServiceClient 和 IMobileServiceSyncTable。以下是我编码的内容:

var _mobileServiceClient = new MobileServiceClient(url);
var store = new MobileServiceSQLiteStore("notesdb.db");
store.DefineTable<Notes>();
_mobileServiceClient.SyncContext.InitializeAsync(store);
var _notesTable = _mobileServiceClient.GetSyncTable<Notes>();

var temp = await _notesTable.ReadAsync();

后台代码如下:

public IQueryable<Notes> GetAllNotes()
{
    return Query(); 
}

每当我这样做时,应用程序将变得没有响应并且永远不会返回。它就像处于死锁模式。

有人遇到过这个问题吗?

查看 MobileServiceClient 用法后:https://docs.microsoft.com/en-us/azure/app-service-mobile/app-service-mobile-dotnet-how-to-use-client-library

你的通话看起来不错,除了一个:

_mobileServiceClient.SyncContext.InitializeAsync(store);

由于您没有等待此方法,因此不会为您的下一个方法初始化同步上下文。

所以只要等待方法,你应该没问题:

await _mobileServiceClient.SyncContext.InitializeAsync(store);

一条几乎每次都可以应用的通用规则:始终等待返回 Task 个对象的方法。

另外,因为你在 service/repository 层,你应该 ConfigureAwait(false) 你的方法:

var _mobileServiceClient = new MobileServiceClient(url);
var store = new MobileServiceSQLiteStore("notesdb.db");
store.DefineTable<Notes>();
await _mobileServiceClient.SyncContext.InitializeAsync(store).ConfigureAwait(false);
var _notesTable = _mobileServiceClient.GetSyncTable<Notes>();

var temp = await _notesTable.ReadAsync().ConfigureAwait(false);

这样做你的代码不会 运行 在 UI 线程中(虽然不能保证,但我不想让你感到困惑 :)。由于您没有 运行 将代码放在同一个线程上,这也将减少可能的死锁。

更多信息:https://medium.com/bynder-tech/c-why-you-should-use-configureawait-false-in-your-library-code-d7837dce3d7f