2009-12-23 2 views
3

WSDL에서 .NET WSE로 생성 된 클라이언트 스텁은 스레드로부터 안전한가요? 물론.NET WSE 클라이언트 스텁은 스레드로부터 안전합니까?

, "스레드 안전"은 필요에 따라 엄격하게 정의 된 용어는 아니다, 그래서 다음에 적어도 관심이 있어요 :

다른가 동시에 접근 같은 스텁 클래스의 다른 인스턴스 쓰레드를 단일 쓰레드 실행과 동일한 효과를 발휘 하는가?

동일한 스텁 클래스의 단일 인스턴스가 단일 스레드 실행에서 임의의 방식으로 인터리브 된 것과 동일한 효과적인 동작을 통해 다른 스레드에서 동시에 액세스 할 수 있습니까?

here (및 원래의 here)이라는 용어를 사용하면 더 정확하게 논의 할 수 있습니다.

답변

2

음, 짧은 답변은 스레드 안전합니까, 그렇습니다. 그 이유는 서비스의 서버 측에서 스레딩 기능에 대한 클라이언트 연결이 더 많아지기 때문입니다. 클라이언트는 서버가 이해할 수있는 방식으로 요청을 레이아웃하는 프록시 일뿐입니다. 그것은 아무것도 모릅니다. 기본 클래스이며 서버에 대한 연결 이외의 외부 액세스가 없습니다. 따라서 서버가 여러 개의 연결을 허용하는 한 괜찮습니다. 따라서 자원 경합 없음 (모든 요청을 처리 할 수있는 서버 제외).

클라이언트 측에서는 여러 스레드가 동일한 클래스이지만 다른 인스턴스를 사용할 수 있습니다. 이는 각 트랜잭션이 원자적일 수 있도록 기본 시나리오가 될 것입니다. 공유 인스턴스 대신 클래스 자신의 액세스를 중심으로 자신 만의 스레드 잠금을 처리해야합니다. 그렇지 않으면 코드 내부의 리소스에 대한 경쟁 조건이 발생할 수 있습니다.

비동기 호출 기능이 있습니다. wsdl 도구로 생성 된 스텁은 begin, end invoke 메서드를 생성하므로 응답을 기다리지 않고 요청을 제출하고 코드를 계속 효과적으로 처리 할 수있는 콜백 메서드를 제공 할 수 있습니다. 이는 아마도 단일 인스턴스로 두 번째 시나리오에 가장 적합 할 것입니다.

그러나 서버 구성 요소의 코딩 방법에 따라 달라집니다. 웹 서비스 인 경우 여러 요청을 동시에 제출할 수 있어야합니다. 그러나 소켓 기반 서비스 인 경우 여러 개의 들어오는 연결을 처리하거나 예를 들어 소켓을 만들려면 끝에 추가 코드를 작성해야 할 수도 있습니다.

즉, 다른 인스턴스는 여러 동시 연결을 처리 할 수있는 서버 측 한계 내에서 단일 스레드 실행과 동일하게 작동합니다.

콜백 프로세스를 사용하는 경우 단일 인스턴스는 제공되는 것으로 두통이 너무 많지 않으면 얻은 것을 얻을 수 있습니다. 그러나 이는 또한 서버 측 코드의 한계로 제한됩니다.

서버 제한을 ​​지정하는 이유는 아웃 바운드 호스트에서 오는 연결 수를 제한하는 웹 서비스를 구축하는 회사가 있으므로 처리량이 제한됩니다. 따라서 사용할 수있는 효과적인 스레드의 수가 줄어들거나 쓸모 없게됩니다.

관련 문제