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