¿Cómo manejar el tiempo de espera en Async Socket?

Tengo un código que usa un socket asíncrono para enviar un mensaje al cliente y espero respuesta de él. Si el cliente no respondió en un mensaje interno específico, considerará el tiempo de espera. Algunos de los artículos en Internet sugieren usar WaitOne, pero esto bloqueará el hilo y diferirá el propósito de usar la finalización de E / S.

Cuál es la mejor manera de manejar el tiempo de espera en el socket asíncrono?

 Sub OnSend(ByVal ar As IAsyncResult)
       Dim socket As Socket = CType(ar.AsyncState ,Socket)
       socket.EndSend(ar)

       socket.BeginReceive(Me.ReceiveBuffer, 0, Me.ReceiveBuffer.Length, SocketFlags.None, New AsyncCallback(AddressOf OnReceive), socket)

 End Sub