2009-09-18 4 views
3

Silverlight의 TCP 통신을 보면서 Silverlight 런타임에 비동기 메서드 만있는 System.Net.Sockets.Socket 클래스를 사용해야했습니다.Socket.SendAsync 스레드가 효과적으로 안전합니까?

두 스레드가 소켓 인스턴스에서 SendAsync를 매우 짧은 시간에 호출하면 어떻게되는지 궁금합니다.

내 걱정은 TCP 채널을 통과하는 섞여있는 바이트가없는 것입니다.

비동기 방식으로 구현 메시지가 단일 스레드가 대기열에서 대기열에 대기열에 놓이기 때문에 아무 것도 발생하지 않습니다 (전선에서 메시지의 내용을 혼합 함).

그러나 확실하지 않고 MSDN이 메서드의 설명에 아무 것도 진술하지 않습니다. 누구이든지 이 확실합니까?

EDIT1 : 아니, 같은가 SendAsync를 호출하기 전에 객체에 잠금이 실제로 전송 된 데이터를 데이터를하지 보낼 수있는 요청을 직렬화하기 때문에 도움이되지 않습니다

lock(this._syncObj) 
{ 
    this._socket.SendAsync(arguments); 
} 

.

답변

6

SendAsync으로 전화 하시려면 SocketAsyncEventArgs의 인스턴스로 ConnectAsync을 먼저 호출해야합니다. 클라이언트와 서버 간의 연결을 나타내는 SocketAsyncEventArgs의 인스턴스입니다. SendAsync으로의 걸려 오는 전화에 방금 사용 된 동일한 인스턴스가 SocketAsyncEventArgsSendAsync을 호출하면 예외가 발생합니다.

동일한 Socket 개체의 복수 호출을 SendAsync으로 만들 수 있지만 다른 인스턴스는 SocketAsyncEventArgs입니다. 예를 들어 (병렬 우주에서 이것이 필요할 수도있는 곳에서) 동일한 HTTP 요청을 동시에 여러 서버에서 동시에 만들 수 있습니다. 이것은 완벽하게 수용 가능하며 클라이언트 나 서버 어느 쪽이 어떤 패킷인지 혼동하지 않을 것입니다.

관련 문제