2010-10-07 23 views
6

據我所知,當從MTA線程使用標記爲使用STA的COM組件時,應該將這些調用編組爲STA線程並從該專用線程執行。在Windows客戶端應用程序的情況下,這意味着它將在UI線程上執行(如果標記爲STA),並且從COM組件向我的回調將由Windows消息處理,併發送到隱藏窗口並處理Windows消息循環。在託管在IIS(7 +)中的WCF服務中使用STA COM組件時如何處理?

如果我在託管在IIS中的WCF服務中使用STA COM組件,會發生什麼?工作進程在STA線程上是否有Windows消息循環?我可以用自己的消息循環啓動我自己的STA線程嗎?

回答

4

COM運行庫負責調用STA內COM對象的方法調用:你是對的,它基於用於調度Windows消息的同一個OS機制,但是你不需要擔心做到這一點 - COM爲你做到了。

做什麼需要擔心的是你的COM對象將在哪個STA中生活。如果你使用COM Interop從WCF服務中實例化出公寓線程的COM對象,那麼你需要小心。

如果執行此操作的線程不是STA線程,則所有進程內COM對象都將處於IIS輔助進程的默認Host STA中。您不希望發生這種情況:所有服務操作的所有COM對象都將在同一個STA中結束。線索在名稱中 - 所有對象只有一個線程 - 所有對其方法的調用都將被序列化,等待公寓中唯一的線程執行它們。您的服務不會擴展以處理多個併發客戶端。

您需要確保您實例化爲服務特定WCF請求的COM對象位於與其他請求創建的對象分開的其自己的STA中。有廣泛的兩種方法可以做到這一點:

  • 旋轉起來自己的線程,在SetApartmentState()指定ApartmentState.STA你開始之前,在其上實例化COM對象爲特定的請求。這是Scott Seely在the link in Kev's answer中詳述的方法:他確保每個服務操作調用都在新的STA初始化的線程上調用。沿着這些路線的一個更難但更具可擴展性的解決方案是實現可重用的STA初始化線程池。
  • 將COM對象託管在COM +應用程序中,以便它們位於單獨的DllHost進程中,其中COM +(通過其名稱爲the Activity的抽象)可以負責將用於不同請求的對象放入不同的STA。

我不確定你指的是什麼時候引用回調。也許你的意思是在您的託管代碼中實現的某個COM接口上的COM方法調用,通過引用傳遞給COM對象作爲其中一個COM對象的方法的參數:如果是這樣,這應該可以工作。但也許你的意思是別的,在這種情況下,或許你可以修改這個問題來澄清。

3

我發現你需要在WCF服務的STA線程上抽取消息,或者你錯過了來自COM對象的回調。

以下代碼有效,但它需要您通過Dispatcher調用COM對象。

ComWrapper comWrapper; 
Thread localThread; 
Dispatcher localThreadDispatcher; 

public Constructor() 
{ 
    localThread = new Thread(ThreadProc) 
    { 
     Name = "test" 
    }; 
    localThread.SetApartmentState(ApartmentState.STA); 

    AutoResetEvent init = new AutoResetEvent(false); 

    localThread.Start(init); 

    init.WaitOne(); 
} 

private void ThreadProc(object o) 
{ 
    localThreadDispatcher = Dispatcher.CurrentDispatcher; 
    ((AutoResetEvent)o).Set(); 

    comWrapper = new ComWrapper() 

    Dispatcher.Run(); 

    localThreadFinished.Set(); 
} 

然後按如下方式撥打電話。

public void UsefulComOperation() 
{ 
    localThreadDispatcher.Invoke(new Action(() => comWrapper.UsefulOperation); 
} 
+1

'localThreadFinished'沒有定義任何地方,只要我可以告訴...是你的意圖在'ThreadProc'頂部宣佈它,因爲'的AutoResetEvent localThreadFinished =(的AutoResetEvent)O'? – transistor1 2015-01-09 22:34:03

相關問題