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