コンソール アプリで Realm を使用する - .NET SDK
Atlas Device SDK は非推奨です。 詳細については、 の廃止ページを参照してください。
Overview
Realmの インスタンスとオブジェクトは SyncronizationContext にバインドされています つまり、 が作成されているのと同じスレッドでのみアクセスできます。 UIスレッドがあるプラットフォームでは、フレームワークによってメインSynchronizationContext
スレッドに がインストールされ、非同期呼び出しでデータベースへの読み取りと書込みを行うことができます。
ただし、コンソール アプリでは UI スレッドがないため、 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); } }