有[MTAThread]
和[STAThread]
属性控制.Net应用程序中COM的单元线程模型,根据我自己(非常有限(的测试,如果从控制台C#应用程序的主线程调用CoInitializeEx()
,则返回1
(S_FALSE
(。
根据微软文档,S_FALSE
的意思是";COM库已在此线程上初始化;。
我想知道的是,框架本身是否真的有合同保证COM将在每个.Net(框架或核心应用程序(线程上初始化?
如果是,是否也保证所有线程都将使用相同的(STA或MTA(模型进行初始化?
我之所以这么问,是因为对于DirectShow应用程序来说,在每个线程上初始化COM是至关重要的,如果框架已经隐式处理了CoInitializeEx()
和CoUnitialize()
,我希望避免在代码中添加对它们的冗余调用。
文档指出托管线程池中的线程是
在多线程单元中
Task.Run()
的文档还指出它是
将要在线程池上运行的指定工作排队
(在这种情况下,ThreadPool
是托管线程池。(
最后,类Thread过时的ApartmentState属性的文档指出
在.NET Framework 2.0版本中,新线程初始化为ApartmentState.MTA(如果以前未设置其公寓状态(它们被启动。
这几乎涵盖了创建线程的所有托管方式。
当然,您也可以在Main()
方法上添加[MTAThread]
属性,但即使这样也没有必要,因为主入口点的默认值也是MTA。
因此,归根结底,除非你调用任何不寻常的第三方代码,否则你几乎可以保证你的线程将是MTA。