Overview
Las instancias y los objetos del reino están vinculados a un
Contexto de sincronización, lo que significa que solo se puede acceder a ellos en el mismo hilo en el que se crearon. En plataformas con un hilo de interfaz de usuario, el framework instala un
SynchronizationContext en el hilo principal, lo que le permite realizar lecturas y escrituras en la base de datos con llamadas asincrónicas.
Sin embargo, en las aplicaciones de consola, no hay ningún subproceso de interfaz de usuario y, por lo tanto, no hay ningún SynchronizationContext instalado. Esto significa que si se await ejecuta una tarea asíncrona, se crea un subproceso aleatorio del grupo de subprocesos, desde el cual ya no se puede acceder a ninguna instancia de Realm abierta previamente.
Para poder usar Realm de manera eficiente entre llamadas asincrónicas, debe instalar un SynchronizationContext, ya sea uno que implemente usted mismo o uno provisto en una 3biblioteca de terceros.
Uso
El siguiente ejemplo de código utiliza el SDK de Realm para añadir Device Sync a una aplicación de consola. La aplicación utiliza el paquete de terceros Nito.AsyncEx para proporcionar AsyncContext un. El código de Realm se ejecuta entonces bajo AsyncContext el.
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); } }