COM上下文中.NET / C#thread“终止”的详细信息

时间:2017-02-13 17:57:59

标签: c# .net multithreading com

我一直在与C#中的Apartment State和COM争夺一段时间,最后了解了c#/ .net线程的公寓状态如何影响COM。我的问题是我需要我的COM对象来使用MTA公寓,并且在过去我一直试图通过改变现有线程的公寓状态(这不起作用:))或拨打电话来实现这一点从使用MTA单元状态创建的新线程到COM对象。但是,我终于弄清楚决定因素是创建COM对象的线程的单元状态。

为了确保我的COM对象实际上是在MTA公寓中创建的,我使用以下“hack”:

        Thread thread =
                new Thread(
                    () => comObject = CreateCOMObject(className));
        thread.SetApartmentState(ApartmentState.MTA);
        thread.Start();
        thread.Join();

这样做似乎我的COM对象在新创建的MTA线程的MTA公寓中很好地创建。 所以我的问题是线程生存期和COM对象生存期如何相互影响。我有一个thread.Join在那里确保COM对象在继续之前被创建,但是这不会暗示线程终止,在这种情况下,COM对象在创建后运行的是什么线程? COM对象是在线程本地存储或主应用程序内存中创建的,还是在COM创建的新线程中创建的? 请注意,这是进程内COM,而不是COM服务器 - 所以我猜它会在现有应用程序中创建一个AppDomain并启动一个全新的线程并在此上下文中创建COM对象?

我的上述解决方案似乎工作正常,我只是想知道细节,以避免生产中的潜在问题。

因此,总而言之,我的问题是这是否是一种安全的方法来确保我的COM对象是使用MTA公寓创建的,以及是否存在对象内存将被垃圾收集或某些东西导致奇怪行为的风险我我在调试时没有注意到。我确实保留了对线程内部创建的comObject的引用,所以我猜应该没有理由让它被垃圾收集。

0 个答案:

没有答案