在控制台应用中使用 Realm - .NET SDK
Atlas Device SDK 已弃用。 有关详细信息,请参阅弃用页面。
Overview
Realm实例和对象绑定到 SynchronizationContext ,这意味着只能在创建它们的同一线程上访问它们。在具有用户界面线程的平台上,框架会在主线程上安装SynchronizationContext
,允许您通过异步调用读取和写入数据库。
但是,在控制台应用程序中,没有用户界面线程,因此没有安装SynchronizationContext
。 这意味着,如果您await
一个异步任务,则会从线程池中启动一个随机线程,您将无法再从中访问任何先前打开的 Realm 实例。
为了能够在异步调用之间有效地使用 Realm,您应该安装SynchronizationContext
- 可以是您自己实现的,也可以是第三方库中提供的。
使用
以下代码示例使用 Realm SDK将 Device Sync 添加到控制台应用程序。 该应用程序使用第三方 Nito.AsyncEx 包以提供 。AsyncContext
然后,Realm 代码在AsyncContext
下运行。
using System; using System.Linq; using System.Threading.Tasks; using Nito.AsyncEx; using Realms; using Realms.Sync; namespace ConsoleTests { class Program { const string myRealmAppId = "myAppId"; public static void Main(string[] args) { Nito.AsyncEx.AsyncContext.Run(async () => await MainAsync(args)); } private static async Task MainAsync(string[] args) { var app = App.Create(myRealmAppId); var user = await app.LogInAsync(Credentials.Anonymous()); var config = new PartitionSyncConfiguration("partition", user); using var realm = await Realm.GetInstanceAsync(); var itemsBiggerThanFive = realm.All<Item>().Where(f => f.Size > 5); foreach (var item in itemsBiggerThanFive) { await Task.Delay(10); // Simulates some background work Console.WriteLine(item.Size); } }