Atlas Device SDK는 더 이상 사용되지 않습니다. 자세한 내용은 지원 중단 페이지 를 참조하세요.
개요
Realm 인스턴스와 객체는 SynchronizationContext 에 바인딩되며, 이는 해당 인스턴스와 객체가 생성된 동일한 스레드에서만 액세스할 수 있음을 의미합니다. 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); } }