2008-09-04 4 views
1

IIS6에서 호스팅되는 웹 서비스에 사용되는 타사 DLL이 있습니다. 문제는 일단이 dll이 메모리에로드되면 스레드를 만든 스레드와 다른 스레드가 dll 내의 모든 코드를 실행하려고하면 예외 AccessViolationException이 발생한다는 것입니다. 작업자 프로세스는 다중 스레드이며 웹 서비스에 대한 각 호출은 풀에서 임의의 스레드를 가져옵니다. 우리는 그것을 메모리에서 언 로딩하고 필요할 때마다 다시로드하려고 시도했지만 프런트 엔드는 .Net이고 나머지는 관리되지 않으므로 실제로 메모리에서 완전히 언로드되지 않습니다. VB와 .Net 2.0을 사용하고 있습니다. 어떤 제안?IIS에서 코드를 실행하는 데 동일한 스레드를 사용하는 방법은 무엇입니까?

(롭 워커에 대한 응답)

우리는 새로운 스레드를 생성하고 DLL을 호출하는 데 사용에 대한 생각했지만, 우리가 어떻게 스레드 앉아 전화를 걸고 대기 않습니다

? .Net 3.0에서 제공 한 Dispatcher 클래스를 사용하지 않고 어떻게 호출을 스레드에 위임합니까? 숨겨진 양식을 작성하여 메시지 루프에 넣으면 효과가있을 수 있습니다. 그리고 폼의 Invoke() 메소드를 호출 할 수 있습니다. 그러나 IIS 호스팅 웹 서비스 내에 양식을 만들면 많은 문제가 발생할 수 있습니다.

답변

1

루프에 스레드를 넣은 다음 스레드를 사용하여 메서드를 실행하기 위해 대리자를 사용하여 Invoke() 메서드를 호출 할 수있는 Dispatcher이라는 .net 3.0 클래스에 대해 읽었습니다. 그러나 .Net 3.0으로 업데이트 할 수없는 경우이 솔루션은 작동하지 않습니다. 또 다른 솔루션은 서버의 다른 응용 프로그램에서 제 3 자 dll을 호스팅하고 어떤 형태로든 Remoting을 사용하여 액세스하는 것입니다. 그러나 Remoting에 문제가있을 수 있습니다. Remoting은 IIS와 유사하게 동작하며 임의의 스레드를 선택하여 코드를 실행하기 때문입니다. 이 문제를 해결하기 위해 DLL 주위에 래퍼를 배치하고이를 사용하여 양식의 Invoke() 메서드를 사용하여 호출을 UI 스레드에 위임 할 수 있습니다.

1

DLL에 대한 모든 호출을 처리하는 래퍼 스레드를 사용하고 직렬화를 처리해야한다고 생각합니다.

이 스레드는 관리되는 스레드 풀 외부에 있으므로 수명을 제어 할 수 있습니다. 그러나 IIS가 웹 서비스가있는 응용 프로그램 도메인을 IIS가 다시 시작하는 것을 방지 할 수 없으면이 방법도 절대 안전하지 않습니다.

동시에 두 웹 서비스 요청이 동시에 발생할 경우 걱정할 필요가 있습니다. DLL에 대한 각 호출은 독립 실행 형입니까, 아니면 다른 요청을 처리하기 전에 단일 웹 서비스 요청과 관련된 모든 호출을 그룹화해야합니까?

0

추가 DLL을 호스팅하는 서비스를 만들 수 있습니다. 원격 액세스를 통해 서비스에 액세스하면 호출을 DLL을 관리하는 스레드로 디스패치합니다.

이 방법을 사용하면 DLL을 호출하는 스레드와 스레드 수명 기간 동안 제어 할 수 있습니다.

0

약간 녹슬지 만 단일 스레드 아파트 COM 객체에서 DLL 호출을 래핑 할 수 있습니다. 이렇게하면 모든 호출이 COM 개체의 Windows 메시징 스레드를 통과하게됩니다. 이 작업을 수행하려면 구성 요소 서비스 내의 서버 응용 프로그램에 구성 요소를 등록해야한다고 생각합니다.

0

dll을 다른 스레드로 다른 인스턴스로 실행할 수 있습니까? thread1과 마찬가지로이 제 3 자 dll의 인스턴스를 만들고 thread2도 수행하지만 thread1이 thread2의 인스턴스를 사용하려고하지 않는 한 해당 예외를 throw하지 않습니다. thats 경우, .Net 어셈블리를로드하고 다음 제거 할 경우 해당 코드가로드 된 후에 .Net 결코 언로드하지 않습니다, 여전히 해당 응용 프로그램 풀에 앉습니다. 한 번에 둘 이상의 인스턴스를 만들 수있는 경우 요청별로 제어하는 ​​별도의 응용 프로그램 풀에이 인스턴스를로드 한 다음 응용 프로그램 풀을 언로드 할 수 있습니다. 성능이 떨어질 수도 있습니다.