РЕЗЮМЕ : Я имею дело с проблемой, из-за которой мое приложение 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);
}
}
}