2011-11-08 32 views

回答

4

這是一個壞主意。線程池線程的生命週期取決於它所執行的代碼,最好是簡短而快速的。這是不是爲STA線程的規則,它必須保持活躍,只要該線程創建的COM對象尚未敲定泵消息循環。與TP線程非常不兼容的要求。無論如何,試圖做到這一點只會給你帶來「無法使用與其基礎RCW分離的COM對象」異常以及死鎖的永無止境的痛苦。這就是爲什麼.NET tp線程始終是MTA的原因。

您必須使用常規的螺紋。

+0

我們ThreadPool中使用「Marshal.FinalReleaseComObject」釋放COM對象,從來沒有與RCW問題.. – MichelZ

+0

它無關的釋放調用,它是在這樣的線程上創建一個COM對象,這就是問題所在。 –

0

我已經分析了源代碼,發現SmartThreadPool不支持STA線程。創建它們的唯一方法就是修改源代碼如下:

  1. 添加StartSTAThreads屬性爲STPStartInfo類。
  2. 之前workerThread.Start()調用添加

    if (_stpStartInfo.StartSTAThreads) 
    { 
        workerThread.SetApartmentState(ApartmentState.STA); 
    } 
    

SmartThreadPool.StartThreads方法。

1

爲了完整起見,current version不支持STA線程:

STPStartInfo stpStartInfo = new STPStartInfo(); 
stpStartInfo.ApartmentState = ApartmentState.STA; 
SmartThreadPool stp = new SmartThreadPool(stpStartInfo);