2014-01-25 4 views
11

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

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

+0

Если это возможно, вам просто нужно вызвать GC.Collect(), прежде чем пытаться удалить. Однако я сам этого не вижу. :-( – Gordon

+0

Более десяти лет назад они уже не знали, что НЕ позвонить GC.Collect() вручную http://blogs.msdn.com/b/ricom/archive/2003/12/02/two-things-to-avoid -for-better-memory-usage.aspx :) –

ответ

3

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

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

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

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

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

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


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

Смежные вопросы