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); } }