[英]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.