私はiPhoneとAndroid用のモノタッチに関する比較的小さなプロジェクトを持っており、WP7を追加する予定です。私はvicicoolstorageをSQLiteのORMとして使用しており、問題なく動作しますが、1つの問題があります。dbを使用してスレッドごとに追加のスレッドを作成します。アプリケーションは超並列であるため、すでにスレッドの限界に達しており、変更したいと思います。スレッドの作成はCSConfig.csで実行され、異なるスレッドからGetDBを呼び出すたびに、新しいスレッドが作成されることがわかりました。
internal static CSDataProvider GetDB(string strContext)
{
if (_threadData == null)
_threadData = new ThreadData();
return _threadData.GetDB(strContext);
}
は_threadData
マークされてい[ThreadStatic]
ます。このGetDBは、ORMを使用するたびに呼び出されると思います(CSConfigのデフォルトDBを自分のDBに設定します)。スレッドはThreadData
コンストラクター内に作成されます。そして、スレッドはこの関数を実行します。
private void CleanupBehind()
{
_callingThread.Join();
foreach (CSDataProvider db in _threadDbMap.Values)
db.Dispose();
}
したがって、基本的には、呼び出し元が終了するのを待ってから、データベース接続を破棄します。
問題は、この動作をオーバーライドして、呼び出し元のスレッドが終了する前に、GCにデータベース接続を破棄させるか、Dispose()
自分自身を呼び出す方法です(DBを使用してすべてのスレッドを制御するので、それを実行できます)。スレッドが終了したときにORMに切断を処理させないのは良くないことは知っていますが、ワーカースレッドごとに1つの追加スレッドを使用することはできません。