콘솔 앱에서 Realm 사용 - .NET SDK
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); } }