2010-12-13 14 views
5

Jeśli mam wątek STA w .NET, i utworzyć obiekt STA COM w tym wątku, a następnie wątek kończy - czy to zabić tego wystąpienia obiektu?COM Interop. NET STA

Czy moje zrozumienie jest poprawne, że obiekty STA COM mogą być dostępne przez wiele wątków, a środowisko uruchomieniowe automatycznie generuje połączenia z wszystkimi wątkami w wątku? Czy ten wątek jest wątkiem, który utworzył instancję? Więc jeśli ten wątek się zakończy, instancja zostanie osierocona i utracona? Czy istnieje osobny wątek utworzony dla instancji STA?
Jak to się dzieje w ASP.Net z ASPCompat = True? Rozumiem, że każde żądanie jest obsługiwane przez losowy wątek roboczy, a jeśli mój komponent STA zostanie umieszczony w sesji, czy losowo zginie, ponieważ wątek procesora żądania, który go utworzył, mógł zostać skończony?

Odpowiedz

5

Jeśli utworzysz obiekt STA COM na wątku .NET STA, wszystkie wywołania twojego obiektu zostaną skierowane do tego wątku.

Jeśli utworzysz obiekt STA COM na wątku MTA .NET, środowisko wykonawcze utworzy wątek STA i przekaże wszystkie wywołania do tego wątku.

Tak więc, gdy istnieje wątek (STA), obiekty COM są niedostępne.

Rozwiązaniem może być utworzenie obiektów na nowym wątku, dla których można kontrolować czas życia.

Zrobiłem coś podobnego tak:

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(); 
} 

Kod rozpoczyna nowy wątek, ustaw appartment do STA i czeka na utworzenie obiektu COM na tym wątku. Sam wątek jest uruchamiany do momentu wyjścia z aplikacji (IsBackground = true) lub zabicia wątku jawnie za pomocą Thread.Abort().

Należy jednak pamiętać, że wszystkie wywołania obiektów COM są porządkowane i w ten sposób wykonywane kolejno po sobie w jednym wątku. To może być wąskie gardło w Twojej aplikacji.

ASPCompat = true sygnalizuje środowisko wykonawcze ASP.NET, że używasz obiektów STA COM i tym samym uruchamiasz stronę w wątku STA. inaczej migth dostaniesz wyjątek lub wszystkie obiekty COM będzie działał w automatycznie wygenerowanym wątku STA udostępnionego przez wszystkich wniosków do swojej strony (patrz MSDN tutaj: http://msdn.microsoft.com/en-us/library/zwk9h2kb(VS.80).aspx)

+0

Więc to oznacza, że ​​jeśli używam ASPCompat i umieścić COM obiekty do sesji będą losowo umierać, ponieważ wątek, który je stworzył zakończy się? –

+1

Myślę, że nie, ponieważ ASP.NET używa wątku, aby obsłużyć żądania. Wątki nie "umrą" po przetworzeniu żądania. Zobacz te artykuły z bazy wiedzy, w których Microsoft stwierdza, że ​​możliwe jest przechowywanie obiektów STA COM w stanie Session, ale zaleca od niego: http://support.microsoft.com/kb/243543/en-us, http://support.microsoft .com/kb/243815/en-us – Jan

Powiązane problemy