繁体   English   中英

COM Interop .NET STA

[英]COM Interop .NET STA

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

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

如果在.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();
}

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

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

ASPCompat = true表示正在使用STA COM对象并因此在STA线程中运行页面的ASP.NET运行时。 否则,您会迁移到一个例外,否则所有COM对象将在由您的页面的所有请求共享的自动生成的STA线程中运行(请参见MSDN, 网址为http : //msdn.microsoft.com/zh-cn/library/zwk9h2kb ( VS .80).aspx

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM