Располагает ли поддержка async API sqlite-net?

Я использую async-интерфейс sqlite-net для кодирования приложения Windows Phone. При написании unit test, чтобы убедиться, что мой адаптер API sqlite-net правильно создал файл, я заметил, что адаптер продолжает удерживаться в дескрипторе файла даже после того, как он вышел из области видимости.

Класс асинхронного подключения (SQLiteAsyncConnection) не поддерживает IDisposable, поэтому я не могу вручную его утилизировать. Глядя на источник, похоже, что асинхронный API создает соединение, использует его и каждый раз использует. Однако, когда мой тестовый код очистки пытается удалить созданную тестовую базу данных, другой ресурс все еще держится на нем.

Ответ 1

У меня была та же самая проблема, если бы база данных должна была быть отправлена ​​по электронной почте для целей отладки/анализа. Не было никакого способа сделать это, потому что соединение выполнено.

Вы можете обойти это, немного изменив реализацию sqlite-net.

В верхней части SQLiteAsync.cs добавьте следующее объявление частичного класса.

namespace SQLite
{
    public partial class SQLiteAsyncConnection
    {
        public void ResetConnections()
        {
            SQLiteConnectionPool.Shared.Reset();
        }
    }
}

а затем измените модификатор доступа выше метода Reset как public.

В коде приложения просто вызовите <YourSQLiteAsyncConnection>.ResetConnections(); перед удалением файла DB.


Затем снова при тестировании вы можете создать свою базу данных в памяти, чтобы не удалять ее вообще. Вы можете добиться этого, установив DatabasePath как ":memory:".