2010-12-13 6 views
5

.NET에 STA 스레드가 있고이 스레드에서 STA COM 개체를 만든 다음 스레드가 완료되면 개체의 해당 인스턴스가 종료됩니까?COM Interop .NET STA

STA COM 개체를 여러 스레드에서 액세스 할 수 있고 런타임이 아파트 스레드에서 발생하는 모든 호출을 자동으로 마샬링합니다. 이 스레드는 인스턴스를 생성 한 스레드입니까? 따라서 해당 스레드가 완료되면 인스턴스가 고아이고 손실됩니까? 또는 STA 인스턴스 용으로 별도의 스레드가 생성 되었습니까?
ASPCompat = True로 ASP.Net에서 어떻게 재생됩니까? 내 이해는 각 요청이 임의의 작업자 스레드에 의해 처리되며, 내 STA 구성 요소가 세션에 배치되는 경우 해당 요청 처리기 스레드가 완료되었을 수 있기 때문에 무작위로 죽을 것인가?

답변

5

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

코드는 새로운 스레드를 시작하는 스레드에서 COM 객체의 생성을 STA 및 대기에 아파트를 설정합니다

나는 그런 비슷한 일을했다. 응용 프로그램이 종료되거나 (IsBackground = true) 스레드가 Thread.Abort()로 명시 적으로 종료 될 때까지 스레드 자체가 실행 중입니다.

그러나 COM 개체에 대한 모든 호출이 마샬링되므로 해당 스레드에서 순차적으로 직렬화됩니다. 앱에서 큰 병목 일 수 있습니다.

ASPCompat = true는 ASP.NET 런타임에서 STA COM 개체를 사용하고 STA 스레드 내에서 페이지를 실행하고 있음을 알립니다. 그렇지 않으면 예외가 migth 또는 모든 COM 객체가 페이지에 모든 요청에 의해 공유 자동으로 생성 된 STA 스레드에서 실행됩니다 (여기 MSDN을 참조하십시오 http://msdn.microsoft.com/en-us/library/zwk9h2kb(VS.80).aspx가)

+0

그래서 이것이 내가 ASPCompat을 사용하는 경우 및 COM을 넣어 의미 하는가 개체를 Session으로 만들면 생성 된 스레드가 끝나기 때문에 무작위로 죽을 것입니까 ?? –

+1

ASP.NET은 요청을 처리하기 위해 스레드 풀을 사용하므로 아무래도 안됩니다. 스레드는 요청을 처리 한 후에 "죽지"않습니다. STA COM 개체를 세션 상태로 저장하는 것이 가능하지만 이에 대해 Microsoft가 권장하는 기술 자료 (http://support.microsoft.com/kb/243543/en-us, http://support.microsoft.microsoft.com)를 참조하십시오. .com/kb/243815/ko-us – Jan

관련 문제