2013-03-05 73 views
1

我有一個相對較小的項目,對iPhone iPhone & Monoouch項目有計劃添加WP7。 我使用vici coolstorage作爲SQLite上的ORM,它對我來說工作正常,但有一個問題。它使用db爲每個線程創建額外的線程。由於應用程序是大規模並行的,因此我已經達到了線程的限制,所以我想改變它。 我發現了創建從不同的線程每個調用GetDB一個新的線程,其中線程的創建在CSConfig.cs進行:Vici coolstorage其他線程

internal static CSDataProvider GetDB(string strContext) 
    { 
     if (_threadData == null) 
      _threadData = new ThreadData(); 

     return _threadData.GetDB(strContext); 
    } 

_threadData標記[ThreadStatic]。 我想這個GetDB每次使用ORM時都會調用(我在CSConfig中將默認數據庫設置爲我的數據庫)。 線程在ThreadData構造函數內部創建。而線程執行此功能:

 private void CleanupBehind() 
     { 
      _callingThread.Join(); 

      foreach (CSDataProvider db in _threadDbMap.Values) 
       db.Dispose(); 
     } 

所以,本質上它等待來電者終止,然後部署數據庫連接。

問題是,我該如何覆蓋這種行爲,讓GC處理數據庫連接或在調用線程終止之前調用我自己的Dispose()(我控制所有使用數據庫的線程,這樣我就可以做到這一點)。我知道當線程結束時不讓ORM處理斷開連接,但我不能在每個工作線程使用一個附加線程。

+0

非常有趣的問題。今天晚些時候我會回覆一些反饋 – 2013-03-05 16:15:35

回答

0

好吧,我知道回答自己的問題是不好的,但仍然是。也許它可以幫助某人。 我已經做了一個解決方法,這是一個清理功能添加到CSConfig。我已經完全刪除了線程創建,並在任何使用數據庫的線程終止之前調用清理。因此我沒有額外的線程。

它引起了一個問題:我在某些場合使用強制線程終止,主要是當線程在網絡操作中時。因此,我不時要遍歷所有數據庫連接並刪除屬於死線程的任何數據庫連接。

但畢竟我有幾乎兩倍的線程。