2013-05-20 2 views
2

WCF를 사용하여 작성한 파일 전송 서비스가 있습니다. 클라이언트가 보낸 파일을 수신합니다. 클라이언트 inturn은 FileStream + MessageContract를 사용하여 파일을 보냅니다. 나는 클라이언트 자체에 여러 스레드를 사용하려고 다음과 같은 속성 WCF + 싱글 톤 + 파일 전송 + 멀티 스레딩

[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single, 
ConcurrencyMode = ConcurrencyMode.Multiple)] 

를 사용하여 싱글로 WCF 파일 전송 서비스를 만들었습니다. 각 스레드는 channelfactory + proxy.CreateChannel의 인스턴스를 만들고 하나의 고유 한 파일을 통해 서비스에 전송합니다. 나는 한 번에 하나의 파일 만 전송되거나 클라이언트 측에서 전송되는 것을 허용하는 서비스 측면의 잠금 장치가 없습니다. 이 코드는 상태 지속성이없는 통과 코드의 일종입니다.

제가 직면 한 문제는 여러 파일을 보내려는 여러 스레드가 보이지 않기 때문입니다. 여러 스레드를 사용하여 여러 파일을 전송하려고 할 때마다 서비스 종류가 동일한 인스턴스에서 여러 파일을 허용하지 않습니다. 이로 인해 파일이 병렬로 전송되는 대신 순차적으로 전송됩니다. 나는 클라이언트 측에서 파일이 보내 졌다고 느낍니다. 그러나 서비스 측에서 그 종류는 방금 들었습니다.

ServiceThrottling 특성을 사용해 보았지만 여전히 차이점을 발견하지 못했습니다. 내가하고있는 일이 잘못되었거나 이런 종류의 접근법이 유효하지 않습니까?

하나의 클라이언트는 하나의 채널에서만 하나의 파일을 보낼 수 있습니까? 많은 스레드가 동일한 서비스에 많은 파일을 보낼 수 있습니까? 누군가 나를 도울 수 있습니까?

감사 하기 Sandeep

+0

제대로 작동하도록 만들었으므로 서비스의 진입 점에 정확히 잠금 개체가 있습니다. 그러나 나는 또 하나의 문제에 직면 해있다. 한 지점에서 두 파일 만 전송됩니다. 추가해야하는 다른 구성이 있습니까? – Sandepku

답변

2

나는이 시리즈에서 내가 직면 한 바보 같은 실수를 인정하기 싫지만, 나는 어리석은 짓을했다.

  1. 단일 스레드 실행 이유. 서비스 항목의 시작 부분에 즉시 잠금을 설정 했으므로 나머지는 대기하는 동안 하나의 스레드 만 허용되었습니다.

  2. 여러 스레드 대신 여러 스레드가 실행되는 이유. 대역폭이 2MBPS에 불과하기 때문에 10MB 각각 10 개의 파일을 전송하려고합니다. 네트워크가 막혔다 고 가정합니다. 내가 10 개의 파일로 시도 할 때마다 100KB 다중 쓰레드가 매력처럼 작동한다. maxConcurrentCalls를 사용하여 쓰레드의 입구를 제어 할 수있다.

건배, 모두, 감사 YK1 BTW

. 내가 틀렸다면, 네트워크 대역폭이 범인이라는 가정을 바로 잡으십시오.

0

시도 클라이언트에 2보다 큰 가치를 재산 ServicePointManager.DefaultConnectionLimit 설정.

+0

아니, 내가 코드의 전체 부분을 제거하고 대신 간단한 Debug.Writeline을 추가하고 콘솔 응용 프로그램에서 서비스를 호스팅하고 있습니다. 놀랍게도, 한 스레드가 실행을 완료 할 때까지 다음 스레드가 허용되지 않는다는 것을 알 수 있습니다. 위의 속성을 설정하려했지만 거의 사용하지 않았습니다. 동시에 나는 매력처럼 작동하는 샘플 응용 프로그램을 사용해 보았습니다. serviceThrottling의 maxConcurrentCalls을 기반으로 서비스에 대한 스레드 수를 제어 할 수 있습니다. 무슨 일이 일어나고 있는지 정말 모르겠다.MessageContract와 관련이 있습니까? – Sandepku

+1

Ok - 당신 의견 '한 번에 두 파일 만 전송 중입니다.' 동시 호출을 만들기 위해 프록시를 올바르게 사용하고 두 번째 호출을하기 전에 첫 번째 응답이 도착하기를 기다리지 않기를 바랍니다. – YK1

+0

또한 각 스레드에 프록시를 작성하여 클라이언트가 서비스에 대한 다중 연결을 작성합니다. 대신 하나의 프록시 만 만들고 클라이언트의 모든 스레드간에 공유하십시오. 동작이 변경되는지 확인하십시오. – YK1