1

我有一个相对较小的 iPhone 和 Android 单点触控项目,并计划添加 WP7。我在 SQLite 上使用 vici coolstorage 作为 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 设置为我的 DB)。线程是在ThreadData构造函数内部创建的。线程执行这个函数:

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

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

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

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

4

1 回答 1

0

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

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

但毕竟我的线程数几乎减少了两倍。

于 2013-03-29T20:05:44.560 回答