我正在为 MySQL 嵌入式服务器编写一个托管 C++/CLI 库包装器。mysql C 库要求我为将要使用它的每个线程调用 mysql_thread_init(),并为使用它后退出的每个线程调用 mysql_thread_end()。
调试任何给定的 VB.Net 项目我可以看到至少七个线程;我想如果 VB 本身没有显式创建工作线程(对此有任何确认?),我的库将只看到一个线程。但是,如果需要,我需要我的库的客户端能够创建工作线程,所以我的库必须在某种程度上是线程感知的。
我能想到的第一个选项是在我的类中公开一些“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 的机制?
提前致谢。