我閱讀了關於公寓模型的內容,但當我試圖瞭解以下內容時,它仍然讓我感到困惑:誰的公寓決定了公寓模式?它是線程的公寓還是創建對象的公寓?
考慮以下情形:對象公寓vs線程公寓
我已經創建了一個只有一個接口,它是
ISimpleCom
C++ ATL COM DLL,我有一個類,接口,只有一個方法test();
該類公開農具從設置STA公寓的CComObjectRootEx<CComSingleThreadModel>
繼承。在C#WinForms項目中引用此DLL,並在MTA線程(而不是UI線程)上創建
SimpleCom
對象。 現在的問題是: 可以說這個對象上的UI線程調用test()
,它會被封送到線程創建的對象還是會在UI線程上執行?- 如果它跟在對象COM單元之後,則應將此調用封送到創建對象的線程,因爲它是STA對象。
- 如果它跟隨創建MTA的線程單元,它應該在UI線程上執行。
哪一個是正確的?
因此,如果我理解正確,從我在後文中描述的場景中,UI線程和創建類的MTA線程都不會執行test()。 test()的執行會被封送到創建了哪個COM類的工作線程中,並且在哪個線程中? – JobNick
它不會在MTA線程上執行。該調用將被封送到工作人員,或者如果它是STA線程,則將其封裝到UI線程中。然後,實際的方法將從那裏執行。 –
爲了避免混淆,可以使用以下線程:1-UI,2-MTA,3-Worker。所以COM對象是在線程#2上創建的,但因爲它是MTA線程,所以它創建了新的線程ID爲3的STA工作線程。現在,UI線程#1將調用COM#的對象test()方法,將您的回覆test()封送到線程#3並由該線程執行? – JobNick