我阅读了关于公寓模型的内容,但当我试图了解以下内容时,它仍然让我感到困惑:谁的公寓决定了公寓模式?它是线程的公寓还是创建对象的公寓?
考虑以下情形:对象公寓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