【发布时间】:2015-06-05 18:55:34
【问题描述】:
我正在为具有以下说明的 DSLR 相机开发 SDK:
Windows 应用程序开发注意事项 创建应用程序时 在 Windows 下运行的,每个都需要一个 COM 初始化 线程,以便从主线程以外的线程访问相机 线。创建用户线程并从中访问相机 线程,请务必执行 CoInitializeEx( NULL, COINIT_APARTMENTTHREADED ) 在线程的开头和 CoUnInitialize() 最后。示例代码如下所示。这是 控制 EdsVolumeRef 或 EdsDirectoryItemRef 对象时相同 另一个线程,不仅仅是 EdsCameraRef。
void TakePicture(EdsCameraRef camera)
{
// Executed by another thread
HANDLE hThread = (HANDLE)_beginthread(threadProc, 0, camera);
// Block until finished
::WaitForSingleObject( hThread, INFINITE );
}
void threadProc(void* lParam)
{
EdsCameraRef camera = (EdsCameraRef)lParam;
CoInitializeEx( NULL, COINIT_APARTMENTTHREADED );
EdsSendCommand(camera, kEdsCameraCommand_TakePicture, 0);
CoUninitialize();
_endthread();
}
我的应用程序是一个 C# WinForms 应用程序,通常我使用托管线程类和 Control.Invoke 函数来避免跨线程问题。
由于我没有用于使用 SDK 的 C# 示例源代码,我的问题是,在标有 [STAThread] 属性的应用程序中使用 CoInitializeEx 是否有用和/或必要?
我没有遇到过需要让我的应用为线程创建一个新单元的情况,这样一些见解将有助于更好地理解线程模型。
更新:在阅读了有关公寓和 COM 的更多信息之后,它开始变得有意义了。现在我想知道 .NET 托管线程类的默认设置是什么,我们可以在没有 P/Invoke 的情况下以托管方式为每个线程指定一个单元模型吗?
【问题讨论】:
-
是的,正如 Hans 在下面的回答中所说,您在启动线程之前调用 Thread.SetApartmentState。
标签: c# .net multithreading com apartments