2013-11-25 2 views
1

ASP.NET VB.NET COM DLL을 사용해야하는 ASP.NET 웹 API 프로젝트가 있습니다. 나는 하나의 컨트롤러를 가지고 있는데, 여기서 com dll로부터 클래스의 객체를 생성하고 그 객체를 내 행동에 사용한다. 제가 ca에서 그 행동을 부를 때 모든 것이 작동하는 것 같습니다.COM DLL을 사용하는 ASP.NET 웹 API

Creating an instance of the COM component with CLSID from the IClassFactory failed due to the following error: 800401f7 (or 800a01b8). 

나는 그 COM 구성 요소는 STA 스레드 모드에서 실행 찾았지만, ASP.NET 웹 API의 : 나는 더 많은 스레드에서 실행할 때 2000에서 2500 개 사이 스레드는하지만, 그때는 COM 개체의 인스턴스를 생성하는 동안이 오류가 MTA 스레드 모드이지만 ASP.NET Web API 프로젝트에서 STA 모드로 변경하는 방법을 찾을 수 없기 때문에이 문제가 발생했는지는 알 수 없습니다.

저는 자체 호스팅 ASP.NET Web API를 사용하며 Windows 서비스에서 호스팅합니다. 서비스를 중지하고 다시 실행하면 ca를 다시 보낼 수 있습니다. 2500 스레드. 편집

: 나는이 같은 샘플 Windows 응용 프로그램에서 스레드를 생성 :

for (int i = 0; i < threadsCount; i++) 
     { 
      Task task = Task.Factory.StartNew(() => { 
       for (int j = 0; j < loopCount; j++) 
       { 
        SendRequest(); 
       } 
      }); 
     } 

EDIT2 : 아마 작업 관리자에서 나는 그 자라 처리 볼 수 있기 때문에 객체는 해제되지 않습니다 나는이 오류가 COM 그것이 2000+ 핸들을 가지고있을 때. Marshal.ReleaseComObject를 호출하므로 잘못 될 수 있는지 잘 모르겠습니다.

+0

이 작업을하지 않으면 컴퓨터가 스레드를 차단하고 최대 스레드는 컴퓨터에서 기본값으로 설정되며 프로세서의 코어에 의해 제한됩니다. – IamStalker

+0

하지만 com 객체를 호출하지 않아도 아무런 문제가 없습니다. –

+0

나는 당신이 그것을 평행하게 생각하지 않는다. – IamStalker

답변

2

ASP.NET Web API 프로젝트의 스레딩 모델을 변경하지 않는 것이 좋습니다.

STA 모드는 호출과 프레임 워크의 다양한 구성 요소 사이에 동기화 계층을 추가합니다. (Could you explain STA and MTA? 참조)

이 동기화 계층을 추가하면이 동기화로 인해 교착 상태가 발생할 수 있습니다.

스레드를 줄이는 것이 좋습니다.

2500 스레드, 효율적 고려하지 것이다 ThreadPool (http://msdn.microsoft.com/en-us/library/system.threading.threadpool%28v=vs.110%29.aspx)

이/할당은 CPU에 Threads 전환의 오버 헤드를 줄일 것 같이 성능을 얻을 것입니다.

오류 : 2500 개 이상의 COM 구성 요소 인스턴스를 만드는 경우 메모리 할당에 문제가있을 수 있습니다. 특히 타사 COM DLL 인 경우 할당 된 메모리가 적절하게 해제되었는지 확인할 수 없습니다. COM 구성 요소가 인스턴스의 양만큼 설계되거나 테스트되지 않을 가능성이 큽니다. 메모리 누출 가능성이 큽니다. 등

그래서 내 조언 등 다음 MTA 모델

스틱, 스레드 줄이려고.

+0

테스트 용으로 너무 많은 스레드를 사용했지만이 웹 API는 항상 Windows 서비스로 실행되므로 문제는 내가 동작을 호출 할 때도 있습니다. 단 10 개의 스레드로 200 번.어딘가에 한계가있을 수 있습니까? 죄송 합니다만 C#의 새로운 기능입니다. –

+0

정확히이 모든 쓰레드를 생성합니까? WebApi에서? Windows 서비스에서? 또는 API에 200 개 이상의 요청을 게시하고 있습니까? 다른 것은 COM을 사용할 때 query-ed 인터페이스가 끝나면'Marshall.ReleaseComObject'를 호출해야합니다. 참조 : http://msdn.microsoft.com/en-us/library/system.runtime.interopservices.marshal.releasecomobject%28v=vs.110%29.aspx – Stefan

+0

샘플 Windows 응용 프로그램에서 API를 200 번 요청합니다. 내 ApiController 클래스에서 com 객체의 인스턴스를 만듭니다. _obj = new Class(); 생성자에서하지만 ReleaseComObject를 호출하지 않았다. 그래서 이것을 시도 할 것이다. –