STA 기반 콘솔 응용 프로그램을 COM 구성 요소 릴리스 지연시킬 수 있습니다. 및 가비지 수집하는 개체의 Finalize 메서드 호출하려면 지연시킬 수 있습니다.

기술 자료 번역 기술 자료 번역
기술 자료: 828988 - 이 문서가 적용되는 제품 보기.
모두 확대 | 모두 축소

현상

있는 단일 스레드 아파트(STA)에 따라 콘솔 응용 프로그램을 만들고 STA 구성 요소 개체 모델(COM) 구성 요소를 사용하는 콘솔 응용 프로그램 Monitor.Enter 메서드는 Thread.Join 메서드는 다른 호출, COM 메시지 펌프 충분한 작업을 수행할 경우 다음과 같은 현상이 발생할 수 있습니다. 또한, 콘솔 응용 프로그램을 오랫동안 실행되는 및 Console.ReadLine 메서드를 호출하는 등의 메시지 펌프를 수행할 작업을 수행하는 경우 다음 현상이 발생할 수 있습니다.
  • COM 구성 요소 릴리스 지연될 수 있습니다.
  • 가비지 수집기가 수집하는 개체의 Finalize 메서드 호출하려면 지연될 수 있습니다.
  • 연장된 기간 동안 응용 프로그램 스레드가 COM 구성 요소에 대한 호출을 차단할 수 있습니다.
  • STA 응용 프로그램 프로세스가 사용하는 메모리 양을 시간이 지나면서 늘어날 수 있습니다.
  • GC.WaitForPendingFinalizers 메서드 호출하여 반환하는 데 시간이 오래 걸릴 수 있습니다.

원인

STA COM 구성 요소에 대한 호출을 올바르게 전달할 해당 구성 요소를 해제하려면 호출을 포함하여 구성 요소를 만든 스레드가 메시지 펌핑 수 합니다. 종료자 스레드가 관리되는 코드가 더 이상 COM 구성 요소를 참조하는 경우 구성 요소 릴리스 메서드를 호출해야 합니다. 그러나 구성 만들어진 STA 스레드가 메시지 펌핑 것입니다 경우 호출 블록을 다시 메시지 펌핑 스레드가 때까지 응용 프로그램이 시작됩니다. 일부 응용 프로그램을 COM 구성 요소 및 기다리기만 수 개체를 많이 만들 수 있습니다. 이러한 응용 프로그램에서 종료자 스레드가 많이 소비하는 경우 펌프 메시지에 대한 STA 기다리는 동안 차단되는 시간을 스레드, 종료자 스레드가 해당 작업을 완료할 수 없게 될 수도 있습니다. 두 목록 중 COM 구성 요소를 릴리스 및 마무리하려면 관리되는 개체 목록을 무제한으로 커질 수 있습니다. 이 문제가 발생하면 STA 응용 프로그램 프로세스가 사용하는 메모리 양을 시간이 지나면서 늘어날 수 있습니다. 또한 GC.WaitForPendingFinalizers 메서드를 호출하여 스레드를 무기한 차단될 수 있습니다.

ReadFileWriteFile, 같은 운영 체제의 파일 및 콘솔 입력/출력 (IO) 작업 메시지 펌프를 수행할지 않습니다. Console.ReadLineConsole.ReadLine ReadFile API를 운영 체제의 의존하므로 펌프 메시지를 중 하나를 수행합니다. 따라서 Console.ReadLine 호출하는 스레드는 메시지를 호출하는 동안 펌프 있지 않습니다.

해결 방법

이 문제를 해결하려면 MTA 스레드 대신 STA 스레드를 만들려면 콘솔 응용 프로그램에서 COM 구성 요소와 통신할 수 있습니다. MTA는 응용 프로그램의 주 스레드를 설정할 수 있습니다. 이렇게 하려면 System.MTAThread 적용 main 메서드를 다음과 같은 특성: ConsoleApplication
public class ConsoleApplication
             {
                 [MTAThread]
                 static void Main()
                 {
                     // Add your code here.
                     Console.ReadLine();
                 }
} 
STA 스레드를 사용하여 COM 구성 요소를 만들어야 합니다 경우에는 STA 스레드는 메시지를 정기적으로 펌프 합니다. 잠시 동안 메시지 펌프, Thread.Join 메서드는 다음과 같이 호출할 수: 100 밀리초 메시지를
Thread.CurrentThread.Join(100)
이 메서드 호출이 pumps. 응용 프로그램의 요구 사항에 따라 제한 시간을 조정할 수 있습니다. 또한 STA 스레드를 절대로 Console.ReadLine 호출하는 등의 바인딩되지 않은 비 펌프 작업을 수행해야 합니다. 대신 작업을 수행하고 작업이 끝나기를 기다리는 MTA 스레드는 STA 스레드가 있어야 합니다.

참조


Microsoft .NET Framework Remoting에 대한 자세한 내용은 다음 Microsoft 웹 사이트를 방문하십시오.
http://msdn2.microsoft.com/en-us/library/1912sb9w(vs.71).aspx
.NET Framework의 가비지 수집에 대한 자세한 내용은 다음 Microsoft 웹 사이트를 방문하십시오.
http://msdn.microsoft.com/msdnmag/issues/1100/gci/
http://msdn.microsoft.com/msdnmag/issues/1200/GCI2/

STA 구성 요소 호출을 차단하는 방법에 대한 자세한 내용은 Microsoft 기술 자료의 다음 문서를 참조하십시오.
291837정보: STA 구성 요소에서 차단 호출을 수행할 작업

속성

기술 자료: 828988 - 마지막 검토: 2004년 2월 9일 월요일 - 수정: 1.4
본 문서의 정보는 다음의 제품에 적용됩니다.
  • Microsoft .NET Framework 1.1
  • Microsoft .NET Framework 1.0
키워드:?
kbmt kbgarbagecollect kbremoting kbprb KB828988 KbMtko
기계 번역된 문서
중요: 본 문서는 전문 번역가가 번역한 것이 아니라 Microsoft 기계 번역 소프트웨어로 번역한 것입니다. Microsoft는 번역가가 번역한 문서 및 기계 번역된 문서를 모두 제공하므로 Microsoft 기술 자료에 있는 모든 문서를 한글로 접할 수 있습니다. 그러나 기계 번역 문서가 항상 완벽한 것은 아닙니다. 따라서 기계 번역 문서에는 마치 외국인이 한국어로 말할 때 실수를 하는 것처럼 어휘, 구문 또는 문법에 오류가 있을 수 있습니다. Microsoft는 내용상의 오역 또는 Microsoft 고객이 이러한 오역을 사용함으로써 발생하는 부 정확성, 오류 또는 손해에 대해 책임을 지지 않습니다. Microsoft는 이러한 문제를 해결하기 위해 기계 번역 소프트웨어를 자주 업데이트하고 있습니다.

피드백 보내기

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com