Xamarin.Forms UWP - Realm.GetInstance не возвращается в 4.1.0 - PullRequest
0 голосов
/ 29 октября 2019

РЕЗЮМЕ : Я имею дело с проблемой, из-за которой мое приложение Xamarin.Forms UWP зависает из-за того, что вызов Realm.GetInstance () никогда не возвращается.

Iсоздал класс RealmFactory, который обрабатывает объекты RealmConfiguration и обрабатывает некоторые простые блокировки потоков. Мы также используем два экземпляра / конфигурации из-за характера наших данных и того факта, что одно из Сфер необходимо очистить, оставляя другое. Когда приложение UWP зависает, я использую функцию «Разбить все» VS17 для проверки потоков, и всегда есть по крайней мере два, иногда три потока, которые вызывают этот класс. Из того, что я могу сказать, замораживание происходит в следующем сценарии: вызов одного из методов фабрики снимает блокировку, запускает вызов Realm.GetInstance (), но никогда не возвращается и, следовательно, никогда не возвращает блокировку.

Это происходит в любом месте приложения, на которое ссылается Realm.GetInstance (), но это не всегда происходит ни в одном из разделов приложения (примерно 10% вероятности того, что оно не будет возвращаться при каждом вызове). Этого также не происходит в проектах Android и Xamarin.Forms для Android, использующих одну и ту же кодовую базу.

Что я пробовал до сих пор:

  • Удалениеблокировки от фабрики (синхронный вызов по-прежнему препятствует выполнению собственного потока, вызывая аналогичные проблемы)
  • Предотвращение одновременных транзакций с областями (на основе эта проблема github , без изменений)
  • Замена базового оператора блокировки мьютексами или семафорами (без изменений)

RealmFactory.cs:

public class RealmFactory : IRealmFactory
    {
        private readonly RealmConfiguration _dbConfig;
        private readonly RealmConfiguration _dbMapConfig;
        private object _lock = new object();

        public RealmFactory(byte[] encryptionKey)
        {
            _dbConfig = new RealmConfiguration
            {
                EncryptionKey = encryptionKey
            };

            _dbMapConfig = new RealmConfiguration("Maps")
            {
                EncryptionKey = encryptionKey
            };
        }

        public Realm CreateInstance()
        {
            lock (_lock)
            {
                return Realm.GetInstance(_dbConfig);
            }
        }

        public Task<Realm> CreateInstanceAsync()
        {
            lock (_lock)
            {
                return Realm.GetInstanceAsync(_dbConfig);
            }
        }

        public Realm CreateMapInstance()
        {
            lock (_lock)
            {
                return Realm.GetInstance(_dbMapConfig);
            }
        }
    }
...