首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >COM互操作.NET STA

COM互操作.NET STA
EN

Stack Overflow用户
提问于 2010-12-14 00:13:07
回答 1查看 1.9K关注 0票数 5

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

STA对象可以被多个线程访问,运行时会自动编组所有发生在单元线程中的调用,我的理解是正确的吗?该线程是创建实例的线程吗?那么,如果该线程结束,该实例将成为孤立实例并丢失?或者是否为STA实例创建了单独的线程?

在ASP.Net和ASPCompat=True中,这是如何发挥作用的?我的理解是,每个请求都由一个随机的工作线程处理,如果我的STA组件被放入会话中,它会因为创建它的请求处理器线程可能已经结束而随机死亡吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2010-12-14 00:54:38

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

如果在.NET MTA线程上创建STA对象,则运行时将创建一个STA线程,并封送处理对该线程的所有调用。

因此,当您的(STA)线程存在时,您的COM对象是不可访问的。

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

我也做过类似的事情:

代码语言:javascript
复制
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向ASP.NET运行时发出信号,通知您正在使用STA对象,从而在STA线程中运行页面。否则你可能会得到一个异常,或者你所有的COM对象将在自动生成的STA线程中运行,该线程由对你的页面的所有请求共享(参见MSDN here:http://msdn.microsoft.com/en-us/library/zwk9h2kb(VS.80).aspx

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4430869

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档