Tag: 公寓

在WinForms线程上使用CoInitializeEx

我正在为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函数来避免跨线程问题。 由于我在C#中没有使用SDK的示例源代码,我的问题是,在标有[STAThread]属性的应用程序中使用CoInitializeEx是否有用和/或必要? 我没有遇到一个场景,我需要让我的应用程序为线程创建一个新的公寓,所以一些洞察力将有助于更好地理解线程模型。 更新:在阅读了更多关于公寓和COM之后,它开始有所了解。 现在我想知道.NET托管线程类默认是什么,我们可以以托管的方式为每个线程指定一个没有P / Invoke的公寓模型吗?