对于iPhone和安卓,我有一个相对较小的单调项目,计划添加WP7。我在SQLite上使用vici冷却器作为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处理断开连接是不好的,但是我不能处理每个工作线程的额外线程。
发布于 2013-03-29 20:05:44
好吧,我知道回答自己的问题是不好的,但还是。也许能帮上忙。我已经做了一个解决办法,就是向CSConfig添加一个清理函数。我已经完全删除了线程创建,并在任何使用数据库的线程终止之前调用清理。因此,我没有多余的线程。
它造成了一个问题:我在某些情况下使用强制线程终止,主要是当线程在网络操作中时。因此,我必须不时地遍历所有数据库连接,并删除属于死线程的任何连接。
但毕竟我的线少了两倍。
https://stackoverflow.com/questions/15228371
复制相似问题