Vici coolstorage额外的线程

时间:2013-03-05 15:58:14

标签: multithreading mono xamarin.ios coolstorage vici

我有一个相对较小的iPhone和iPhone触控单项目。 Android计划添加WP7。 我使用vici coolstorage作为SQLite上的ORM,它对我来说很好,但是有一个问题。它使用db为每个线程创建额外的线程。我已经达到线程的极限,因为应用程序是大规模并行的,所以我想改变它。 我发现线程创建是在CSConfig.cs中执行的,其中每个从不同线程调用GetDB创建一个新线程:

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

        return _threadData.GetDB(strContext);
    }

_threadData标记为[ThreadStatic]。 我想每次使用ORM时都会调用这个GetDB(我将CSConfig中的默认DB设置为我​​的数据库)。 该线程在ThreadData构造函数中创建。并且线程执行此函数:

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

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

因此,基本上它等待调用者终止然后处理数据库连接。

问题是,我怎样才能覆盖这种行为,让GC在调用线程终止之前处理数据库连接或自己调用Dispose()(我使用DB控制所有线程,所以我可以这样做) 。我知道在线程结束时不让ORM处理断开连接是不好的,但我不能在每个工作线程中使用一个额外的线程。

1 个答案:

答案 0 :(得分:0)

好吧,我知道回答自己的问题很糟糕,但仍然如此。也许它可以帮助某人。 我已经做了一个解决方法,即将清理功能添加到CSConfig。我已经完全删除了线程创建,并在使用数据库的任何线程终止之前调用清理。因此,我没有额外的线程。

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

但毕竟我的线程减少了近两倍。