2010-05-14 2 views
3

설치 - DOTNET/C#을 통해 간단한 COM 추가 기능을 만들면 5 초 동안 현재 스레드에서 대기 상태가됩니다. 윈도우 2003 서버를 실행하면 COM 구성 요소가자는 동안 사이트의 test.asp라는 페이지 블록이 다른 모든 스레드,다른 스레드를 순차적으로 차단하지 않는 Classic ASP 용 DOTNET COM interop 어셈블리를 만들려면 어떻게해야합니까?

<%@ Language=VBScript %> 
<%option explicit%> 
<%response.Buffer=false%> 

<% 



dim test 
set test = CreateObject("ComTester.Tester") 


%> 

<HTML> 
<HEAD></HEAD> 
<BODY> 
    <% 
    Response.Write(test.Test()) 
    set test = nothing 

    %> 

</BODY> 
</HTML> 

: ASP 페이지에서

namespace ComTest 
{ 
    [ComVisible(true)] 
    [ProgId("ComTester.Tester")] 
    [Guid("D4D0BF9C-C169-4e5f-B28B-AFA194B29340")] 
    [ClassInterface(ClassInterfaceType.AutoDual)] 
    public class Tester 
    { 
     [STAThread()] 
     public string Test() 
     { 
      System.Threading.Thread.Sleep(5000); 
      return DateTime.Now.ToString(); 
     } 

    } 
} 

는, 테스트 구성 요소를 호출.

모든 ASP 작업자 스레드를 차단하지 않는 ASP 용 COM 구성 요소를 만들려면 어떻게해야합니까?

+1

테스트를 통해 직렬화/차단이 세션 수준에서만 발생한다는 것을 알 수 있습니다 (동일한 세션을 가진 다른 모든 페이지는 순차적으로 차단됨). –

답변

0

나는 여기에서 일어나는 일은 모든 웹 요청이 어딘가에서 직렬화되고 있다는 것입니다. 이것이 어디에서 일어나는지 정확히 말하기는 어렵지만 몇 가지 가능성이 있습니다.

  • COM 개체는 단일 스레드 아파트에 있으며 웹 요청간에 어떻게 든 공유됩니다. STA에있는 COM 개체는 해당 스레드를 만든 스레드 이외의 스레드에서 생성 된 스레드로 마샬링 된 호출을 발생시킵니다. 서로 다른 스레드의 호출자는 Tester.Test을 실행하기 위해 줄을 서서 기다려야합니다.

  • ASP 요청이 어떻게 든 직렬화됩니다. ASP가 어떻게 작동하는지에 대한 나의 이해를 바탕으로 나는 그것이 어떻게 일어날 지 상상하기가 어렵습니다. 어쩌면 AspCompat가 true로 설정된 ASP.NET 페이지가있어 해당 아파트가 같은 아파트를 공유하게됩니다. 나는 정말로 여기에서 파악하고 있지만 문제는 STA COM 객체의 동작과 관련이 있다고 말할 수 있습니다.

관련 문제