1

私は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つの追加スレッドを使用することはできません。

4

1 に答える 1

0

自分の質問に答えるのは悪いことですが、それでもです。多分それは誰かを助けることができます。クリーンアップ用の関数をに追加するという回避策を実行しましたCSConfig。スレッドの作成を完全に削除し、データベースを使用しているスレッドが終了する前にクリーンアップを呼び出します。したがって、余分なスレッドはありません。

それは問題を引き起こしました:私は時々、スレッドがネット操作の中にあるとき、強制的なスレッド終了を使用します。そのため、時々、すべてのデータベース接続を繰り返し処理し、デッドスレッドに属するものを削除する必要があります。

しかし、結局のところ、スレッドはほぼ2倍少なくなっています。

于 2013-03-29T20:05:44.560 に答える