【问题标题】:COM Interop .NET STACOM 互操作 .NET STA
【发布时间】:2010-12-13 16:13:06
【问题描述】:

如果我在 .NET 中有一个 STA 线程,并且我在该线程中创建了一个 STA COM 对象,然后该线程结束——这会杀死该对象的实例吗?

我的理解是否正确,STA COM 对象可以被多个线程访问,并且运行时会自动编组所有在单元线程中发生的调用?该线程是创建实例的线程吗?那么如果该线程完成,该实例是孤立的并丢失了吗?或者是否为 STA 实例创建了单独的线程?
ASPCompat=True 在 ASP.Net 中如何发挥作用?我的理解是每个请求都是由一个随机的工作线程来处理的,如果我的 STA 组件被放入会话中,它会不会因为创建它的请求处理器线程可能已经完成而随机死掉?

【问题讨论】:

    标签: .net com-interop


    【解决方案1】:

    如果您在 .NET STA 线程上创建 STA COM 对象,则对您的对象的所有调用都将编组到该线程。

    如果您在 .NET MTA 线程上创建 STA COM 对象,运行时将创建一个 STA 线程并编组对该线程的所有调用。

    因此,当您的 (STA) 线程存在时,您的 COM 对象将无法访问。

    一种解决方案可能是在您可以控制其生命周期的新线程上创建对象。

    我做过类似的事情:

    using (ManualResetEventSlim mre = new ManualResetEventSlim(false))
    {  
        Thread _STAThread = new Thread(new ThreadStart(() =>
                    {
                        globalComObject = new ComClass();
                        mre.Set();
                        try
                        {
                            Thread.CurrentThread.Join();
                        }
                        catch (ThreadAbortException)
                        {
                        }
                    }));
                    _STAThread.SetApartmentState(ApartmentState.STA);
                    _STAThread.IsBackground = true;
                    _STAThread.Start();
                    mre.Wait();
    }
    

    代码启动一个新线程,将 appartment 设置为 STA 并等待在该线程上创建 COM 对象。 线程本身一直在运行,直到您的应用程序退出 (IsBackground = true) 或您使用 Thread.Abort() 显式终止线程。

    但请记住,对您的 COM 对象的所有调用都经过编组,因此在该线程上一个接一个地序列化执行。这可能是您应用的一大瓶颈。

    ASPCompat=true 向 ASP.NET 运行时发出信号,表明您正在使用 STA COM 对象并因此在 STA 线程中运行页面。否则您可能会遇到异常,否则您的所有 COM 对象将在自动生成的 STA 线程中运行,该线程由 所有 对您的页面的请求共享(请参阅此处的 MSDN:http://msdn.microsoft.com/en-us/library/zwk9h2kb(VS.80).aspx

    【讨论】:

    • 那么这是否意味着如果我使用 ASPCompat 并将 COM 对象放入 Session 中,它们会随机死亡,因为创建它们的线程已经完成??
    • 我认为没有,因为 ASP.NET 使用线程池来处理请求。处理请求后线程不会“死亡”。请参阅这些知识库文章,其中 microsoft 声明可以将 STA COM 对象存储为会话状态,但建议不要这样做:support.microsoft.com/kb/243543/en-ussupport.microsoft.com/kb/243815/en-us
    猜你喜欢
    • 2010-12-24
    • 1970-01-01
    • 2011-06-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-25
    • 1970-01-01
    • 2012-03-31
    相关资源
    最近更新 更多