문제

나는 Silverlight의 TCP 커뮤니케이션에 부딪쳤으며 Silverlight 런타임에 비동기 방법 만있는 System.net.sockets.socket 클래스를 사용해야했습니다.

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

내 걱정은 TCP 채널을 통과하는 바이트를 혼합하지 않는 것입니다.

비동기 방법 나는 생각한다 메시지는 단일 스레드가 탈취하여 그러한 일이 발생하지 않는 대기열에 배치됩니다 (와이어에서 메시지의 내용을 혼합하는).

그러나 확실하지 않으며 MSDN은 메소드 설명에 아무것도 언급하지 않습니다. 누구야 확실한 이의?

edit1 : 아니요, 다음과 같은 sendasync를 호출하기 전에 물체를 잠그십시오.

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

이것은 실제로 보내지 않은 데이터가 아닌 데이터를 보내 겠다는 요청을 일련화하기 때문에 도움이되지 않습니다.

도움이 되었습니까?

해결책

전화하기 위해 SendAsync 먼저 전화해야합니다 ConnectAsync 인스턴스와 함께 SocketAsyncEventArgs. 그것의 인스턴스 SocketAsyncEventArgs 클라이언트와 서버 간의 연결을 나타냅니다. 부름 SendAsync 동일한 인스턴스로 SocketAsyncEventArgs 그것은 방금 뛰어난 전화에 사용되었습니다. SendAsync 예외가 발생합니다.

여러 번의 뛰어난 전화를 할 수 있습니다 SendAsync 동일한의 Socket 객체이지만 다른 인스턴스 만 사용합니다 SocketAsyncEventArgs. 예를 들어 (이것이 필요할 수있는 병렬 우주에서) 동시에 동시에 동일한 서버에 여러 개의 HTTP 게시물을 만들 수 있지만 다른 연결에서는 여러 HTTP 게시물을 만들 수 있습니다. 이것은 완벽하게 허용되며 일반 클라이언트 나 서버는 어떤 패킷이 어떤 패킷인지 혼란스럽지 않습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top