我使用SmartThreadPool創建STA線程 http://www.codeproject.com/KB/threads/smartthreadpool.aspx如何通過阿米吧裏SmartThreadPool
雖然有提到,STA線程可以催生,但我無法找到一個例子。我想在我的池中創建所有STA線程。
我使用SmartThreadPool創建STA線程 http://www.codeproject.com/KB/threads/smartthreadpool.aspx如何通過阿米吧裏SmartThreadPool
雖然有提到,STA線程可以催生,但我無法找到一個例子。我想在我的池中創建所有STA線程。
這是一個壞主意。線程池線程的生命週期取決於它所執行的代碼,最好是簡短而快速的。這是不是爲STA線程的規則,它必須保持活躍,只要該線程創建的COM對象尚未敲定泵消息循環。與TP線程非常不兼容的要求。無論如何,試圖做到這一點只會給你帶來「無法使用與其基礎RCW分離的COM對象」異常以及死鎖的永無止境的痛苦。這就是爲什麼.NET tp線程始終是MTA的原因。
您必須使用常規的螺紋。
我已經分析了源代碼,發現SmartThreadPool不支持STA線程。創建它們的唯一方法就是修改源代碼如下:
之前workerThread.Start()調用添加
if (_stpStartInfo.StartSTAThreads)
{
workerThread.SetApartmentState(ApartmentState.STA);
}
到SmartThreadPool.StartThreads方法。
爲了完整起見,current version不支持STA線程:
STPStartInfo stpStartInfo = new STPStartInfo();
stpStartInfo.ApartmentState = ApartmentState.STA;
SmartThreadPool stp = new SmartThreadPool(stpStartInfo);
我們ThreadPool中使用「Marshal.FinalReleaseComObject」釋放COM對象,從來沒有與RCW問題.. – MichelZ
它無關的釋放調用,它是在這樣的線程上創建一個COM對象,這就是問題所在。 –