0

MySQL 組み込みサーバー用のマネージ C++/CLI ライブラリ ラッパーを作成しています。mysql C ライブラリでは、それを使用するすべてのスレッドに対して mysql_thread_init() を呼び出し、それを使用した後に終了する各スレッドに対して mysql_thread_end() を呼び出す必要があります。

特定の VB.Net プロジェクトをデバッグすると、少なくとも 7 つのスレッドが表示されます。VB がワーカー スレッド自体を明示的に作成しない場合、私のライブラリは 1 つのスレッドしか表示しないと思います (それに関する確認はありますか?)。ただし、必要に応じてライブラリのクライアントがワーカー スレッドを作成できるようにする必要があるため、ライブラリはある程度スレッドに対応している必要があります。

私が考えることができる最初のオプションは、クラスでいくつかの「EnterThread()」および「LeaveThread()」メソッドを公開することです。これにより、クライアントコードは最初と DoWork() メソッドを終了する前にそれらを明示的に呼び出します。これは、(1) .Net がユーザーが認識していないスレッドを「魔法のように」作成せず、(2) ユーザーが何らかの try/finally 構造でメソッドを呼び出すように十分注意している場合に機能します。

とはいえ、ユーザーが手動で処理するのはあまり好きではないので、その点について手を差し伸べることはできないかと考えています。純粋な Win32 C/C++ DLL では、DllMain DLL_THREAD_ATTACH および DLL_THREAD_DETACH 疑似イベントがあり、必要に応じて mysql_thread_init() および mysql_thread_end() を呼び出すためにそれらを使用できますが、管理された C++/CLI にはそのようなものはないようですコード。いくらかのパフォーマンスを犠牲にして(それほどではないと思います)、TLSを使用して「新しいスレッドからの使用」のケースを検出できますが、スレッドが終了するケースのメカニズムは想像できません。

そこで、私の質問は次のとおりです。(1) .net は、ユーザーが気付かないうちにアプリケーション スレッドを作成できますか? (2)マネージ C++/CLI から DLL_THREAD_ATTACH / DLL_THREAD_DETACH と同様に使用できるメカニズムはありますか?

前もって感謝します。

4

1 に答える 1