Как использовать уведомления коллекции Realm в базовом приложении ASP. NET? - PullRequest
0 голосов
/ 26 марта 2020

Я пытался использовать этот пример кода из Realm. NET SDK, но мой код обработчика никогда не вызывается последовательно:

var token = realm.All<Person>().SubscribeForNotifications ((sender, changes, error) =>
{
    // Access changes.InsertedIndices, changes.DeletedIndices, and changes.ModifiedIndices
});

Я пытался запустить это из нескольких различных потоков, но я подозреваю, что ни один из них не имеет петлителя / runl oop, требование, указанное в SDK. Можно ли даже создать поток Looper / Runl oop в ASP. NET Core, который будет работать с Realm? Как бы я это сделал?

1 Ответ

0 голосов
/ 31 марта 2020

Наконец-то выяснилось, как реализовать петлитель / прогон l oop, который работает для уведомлений области. Ключевые части решения:

  1. Использование размещенной службы для запуска / остановки потока.
  2. Использование Nito.AsyncEx для установки sh контекста синхронизации для этого потока.
  3. L oop внутри потока, вызывая метод RefreshAsyn c для экземпляра области.
  4. Вызовите Task.Delay между l oop итерациями, чтобы сохранить поток дружественным к процессору.

Вот код:

    public class RealmNotificationService : IHostedService
    {
        private System.Threading.Thread _thread;

        public Task StartAsync(CancellationToken stoppingToken)
        {
            _thread = new System.Threading.Thread(() =>
                Nito.AsyncEx.AsyncContext.Run(() => Looper(stoppingToken))
                );
            _thread.Start();
            return Task.CompletedTask;
        }

        public Task StopAsync(CancellationToken stoppingToken)
        {
            return Task.CompletedTask;
        }

        private async void Looper(CancellationToken stoppingToken)
        {
            using (var connection = await Realm.GetInstanceAsync({YOUR-CONFIG}))
            {
                var token = connection.All<{YOUR-OBJECT}>().SubscribeForNotifications((sender, changes, error) =>
                {
                    // Access changes.InsertedIndices, changes.DeletedIndices, and changes.ModifiedIndices
                });
            }
            while (!stoppingToken.IsCancellationRequested)
            {
                await connection.Realm.RefreshAsync();
                await Task.Delay(2000, stoppingToken);
            }
        }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...