我正在爲MySQL嵌入式服務器編寫託管C++/CLI庫包裝程序。 mysql C庫要求我爲將要使用它的每個線程調用mysql_thread_init(),並且在使用它之後退出的每個線程都調用mysql_thread_end()。C++/CLI託管線程清理
調試任何給定的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?
在此先感謝。
我可以看到還有[ThreadStatic]屬性;也許和TLS一樣,如果句柄是nullptr我可以分配一個對象,它從構造函數調用init函數,它會在處理時調用結束線程代碼,但是不知道框架是否會從同一個線程調用IDisposable代碼,創建的,任何人都知道這個嗎? – 2009-12-12 11:21:16