2013-03-05 76 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。我已经完全删除了线程创建,并在任何使用数据库的线程终止之前调用清理。因此我没有额外的线程。

它引起了一个问题:我在某些场合使用强制线程终止,主要是当线程在网络操作中时。因此,我不时要遍历所有数据库连接并删除属于死线程的任何数据库连接。

但毕竟我有几乎两倍的线程。