如果我在.NET中有一个STA线程,我在该线程中创建了一个STA对象,然后线程结束了--这会杀死该对象的实例吗?
STA对象可以被多个线程访问,运行时会自动编组所有发生在单元线程中的调用,我的理解是正确的吗?该线程是创建实例的线程吗?那么,如果该线程结束,该实例将成为孤立实例并丢失?或者是否为STA实例创建了单独的线程?
在ASP.Net和ASPCompat=True中,这是如何发挥作用的?我的理解是,每个请求都由一个随机的工作线程处理,如果我的STA组件被放入会话中,它会因为创建它的请求处理器线程可能已经结束而随机死亡吗?
发布于 2010-12-14 00:54:38
如果在.NET STA线程上创建STA对象,则对该对象的所有调用都将封送到该线程。
如果在.NET MTA线程上创建STA对象,则运行时将创建一个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向ASP.NET运行时发出信号,通知您正在使用STA对象,从而在STA线程中运行页面。否则你可能会得到一个异常,或者你所有的COM对象将在自动生成的STA线程中运行,该线程由对你的页面的所有请求共享(参见MSDN here:http://msdn.microsoft.com/en-us/library/zwk9h2kb(VS.80).aspx
https://stackoverflow.com/questions/4430869
复制相似问题