2014-01-25 15 views
11

Ich benutze die sqlite-net async API um eine Windows Phone App zu programmieren. Beim Schreiben eines Komponententests, um sicherzustellen, dass mein Adapter an die sqlite-net-API die Datei ordnungsgemäß erstellt hat, habe ich festgestellt, dass der Adapter das Datei-Handle weiterhin festhält, auch nachdem es den Gültigkeitsbereich verlassen hat.Unterstützt die sqlite-net async API-Unterstützung?

Die asynchrone Verbindungsklasse (SQLiteAsyncConnection) unterstützt IDisposable nicht, so dass ich sie nicht manuell entsorgen kann. Wenn man sich die Quelle anschaut, sieht es so aus, als ob die asynchrone API eine Verbindung herstellt, sie verwendet und sie jedes Mal disponiert. Wenn jedoch mein Testbereinigungscode versucht, die erstellte Testdatenbank zu löschen, hält sich noch eine andere Ressource fest.

+0

Wenn das der Fall war, müssen Sie nur GC.Collect() aufrufen, bevor Sie versuchen, zu löschen. Ich sehe dieses Verhalten jedoch nicht selbst. :-( – Gordon

+0

Vor mehr als zehn Jahren wussten sie bereits, dass sie GC.Collect() nicht manuell aufrufen sollten http://blogs.msdn.com/b/ricom/archive/2003/12/02/two-things-to-avoid -für-besser-speicher-benutzung.aspx :) –

Antwort

3

Ich hatte genau das gleiche Problem, wenn Datenbank per E-Mail zu Debugging/Analysezwecken gesendet werden sollte. Es gab keine Möglichkeit, das zu tun, weil die Verbindung besteht.

Sie können dies umgehen, indem Sie die sqlite-net-Implementierung ein wenig ändern.

Oben auf SQLiteAsync.cs folgende partielle Klassendeklaration hinzufügen.

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

und dann Zugriffsmodifikator als public von oben Reset Verfahren ändern.

In Ihrem Anwendungscode rufen Sie einfach <YourSQLiteAsyncConnection>.ResetConnections(); vor dem Löschen der DB-Datei.


Dann noch einmal, beim Testen können Sie Ihre Datenbank im Speicher erstellen, so dass Sie sie überhaupt nicht löschen müssen. Sie können dies erreichen, indem Sie DatabasePath als ":memory:" festlegen.

Verwandte Themen