.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가)
출처
2010-12-13 16:54:37
Jan
그래서 이것이 내가 ASPCompat을 사용하는 경우 및 COM을 넣어 의미 하는가 개체를 Session으로 만들면 생성 된 스레드가 끝나기 때문에 무작위로 죽을 것입니까 ?? –
ASP.NET은 요청을 처리하기 위해 스레드 풀을 사용하므로 아무래도 안됩니다. 스레드는 요청을 처리 한 후에 "죽지"않습니다. STA COM 개체를 세션 상태로 저장하는 것이 가능하지만 이에 대해 Microsoft가 권장하는 기술 자료 (http://support.microsoft.com/kb/243543/en-us, http://support.microsoft.microsoft.com)를 참조하십시오. .com/kb/243815/ko-us – Jan