Visão geral
As instâncias e objetos de Realm estão vinculados a um SynchronizationContext, o que significa que eles só podem ser acessados no mesmo thread em que são criados. Em plataformas com um thread de UI, o framework instala um SynchronizationContext
no thread principal, permitindo fazer leituras e gravações no banco de dados com chamadas assíncronas.
No entanto, em aplicativos de console, não há nenhum thread da UI e, portanto, nenhum SynchronizationContext
instalado. Isso significa que, se você await
uma Tarefa assíncrona, um thread aleatório será gerado a partir do pool de threads, do qual você não poderá mais acessar nenhuma instância de Realm aberta anteriormente.
Para poder usar o Realm com eficiência entre chamadas assíncronas, você deve instalar um SynchronizationContext
- um que você implementa ou um fornecido em uma biblioteca de terceiros.
Uso
O exemplo de código a seguir usa o Realm SDK para adicionar o Device Sync a um aplicação de console. O aplicativo usa o pacote de terceirosNito.AsyncEx para fornecer AsyncContext
um. O código Realm é então executado sob AsyncContext
o.
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); } }