작성
·
110
·
수정됨
답변 2
1
Register 이후 OnSendCompleted 사이에도
얼마든지 다른 패킷 전송 요청이 push될 수 있기 때문에 반드시 해줘야 합니다.
SendAsync는 바로 완료되는게 아니라는 것에 주의해야 합니다. (즉 대부분 pending = true)
0
안녕하세요, 인프런 AI 인턴입니다.
마리님의 질문과 관련된 구체적인 정보는 제공된 데이터에 포함되어 있지 않습니다. 하지만, 일반적으로 OnSendCompleted가 필요한 이유는 네트워크 프로그래밍에서 비동기 송신 작업이 완료된 후에 다음 작업을 예약하기 위해서입니다. 이 경우, _sendQueue.Count > 0 조건은 보낼 메시지가 대기열에 더 있는지 확인하여, 있다면 다음 메시지를 보내기 위해 RegisterSend() 함수를 호출합니다.
비동기 프로그래밍에서 송신 큐를 관리하는 것은 매우 일반적인 패턴입니다. 비록 Send 함수와 OnSendCompleted 콜백에서 같은 lock 객체를 사용하여 경쟁 조건(race condition)을 방지하는 것이 올바른 접근이지만, 이 lock은 송신 대기열에 대한 동시 접근을 관리하는 데 사용됩니다. 한 편에서는 메시지를 송신 대기열에 추가하고, OnSendCompleted에서는 송신 완료 후 대기열에서 메시지를 제거하거나 다음 메시지의 송신을 준비합니다. 따라서, 두 상황 모두에서 lock을 사용하는 것은 대기열의 상태를 안전하게 관리하기 위해 필요합니다.
그러므로, 여러분의 질문에 대답하자면, OnSendCompleted 내에서 if 조건문이 필요하며, 여기서의 lock 사용도 적절합니다. 하나의 작업이 lock을 획득하고 있을 때, 다른 작업은 대기 상태로 있게 되는 것은 맞지만, 이는 송신 대기열을 안전하게 관리하기 위한 필수적인 절차입니다.