Usar o Realm em um aplicativo de console - .NET SDK
Nesta página
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 uma thread de UI, a framework instala um SynchronizationContext
na thread principal, permitindo fazer leituras e escritas no banco de 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 aplicativo de console. O aplicativo usa o Nito.AsyncEx de terceiros pacote para fornecer um AsyncContext
. O código Realm é então executado sob o 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); } }