CoInitialize()是否总是在每个.Net Framework/.Net Core线程上隐式调用



[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。

最新更新