CoInitialize() 是否总是在每个 .Net Framework / .Net Core 线程上隐式调用?
Is CoInitialize() always implicitly called on every .Net Framework / .Net Core thread?
有 [MTAThread]
和 [STAThread]
属性控制 .Net 应用程序中 COM 的单元线程模型,根据我自己的(非常有限的)测试,CoInitializeEx()
returns 1
(S_FALSE
) 如果从控制台 C# 应用程序的主线程调用。
根据 Microsoft 文档,S_FALSE
表示“COM 库已在此线程上初始化”。
我想知道的是,框架本身是否真的有合同保证 COM 将在每个 .Net(框架或核心应用程序)线程上初始化?
如果是这样,是否也保证所有线程都将使用相同的(STA 或 MTA)模型进行初始化?
我问这个是因为对于 DirectShow 应用程序来说,在每个线程上初始化 COM 是至关重要的,我想避免在代码中添加对 CoInitializeEx()
和 CoUnitialize()
的冗余调用,如果这些已经由框架隐式处理。
文档指出 threads from the Managed Thread Pool 是
in the multithreaded apartment
documentation for Task.Run()
也说明了
Queues the specified work to run on the ThreadPool
(ThreadPool
在这种情况下是托管线程池。)
最后,the documentation for class Thread's obsolete ApartmentState property 指出
In .NET Framework version 2.0, new threads are initialized as
ApartmentState.MTA if their apartment state has not been set before
they are started.
这几乎涵盖了创建线程的所有托管方式。
您当然也可以在 Main()
方法上添加 [MTAThread]
属性,但即使这样也没有必要,因为主入口点的默认值也是 MTA。
所以在一天结束时 - 除非您调用任何不寻常的第三方代码,否则您几乎可以保证您的线程将是 MTA。
有 [MTAThread]
和 [STAThread]
属性控制 .Net 应用程序中 COM 的单元线程模型,根据我自己的(非常有限的)测试,CoInitializeEx()
returns 1
(S_FALSE
) 如果从控制台 C# 应用程序的主线程调用。
根据 Microsoft 文档,S_FALSE
表示“COM 库已在此线程上初始化”。
我想知道的是,框架本身是否真的有合同保证 COM 将在每个 .Net(框架或核心应用程序)线程上初始化?
如果是这样,是否也保证所有线程都将使用相同的(STA 或 MTA)模型进行初始化?
我问这个是因为对于 DirectShow 应用程序来说,在每个线程上初始化 COM 是至关重要的,我想避免在代码中添加对 CoInitializeEx()
和 CoUnitialize()
的冗余调用,如果这些已经由框架隐式处理。
文档指出 threads from the Managed Thread Pool 是
in the multithreaded apartment
documentation for Task.Run()
也说明了
Queues the specified work to run on the ThreadPool
(ThreadPool
在这种情况下是托管线程池。)
最后,the documentation for class Thread's obsolete ApartmentState property 指出
In .NET Framework version 2.0, new threads are initialized as ApartmentState.MTA if their apartment state has not been set before they are started.
这几乎涵盖了创建线程的所有托管方式。
您当然也可以在 Main()
方法上添加 [MTAThread]
属性,但即使这样也没有必要,因为主入口点的默认值也是 MTA。
所以在一天结束时 - 除非您调用任何不寻常的第三方代码,否则您几乎可以保证您的线程将是 MTA。