簡體   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