换句话说,在开始执行委托之间收到的新数据包会发生什么:
public static void Read_Callback(IAsyncResult ar){
StateObject so = (StateObject) ar.AsyncState;
Socket s = so.workSocket;
int read = s.EndReceive(ar);
if (read > 0) {
so.sb.Append(Encoding.ASCII.GetString(so.buffer, 0, read));
下一次在该套接字上调用beginReceive吗?
s.BeginReceive(so.buffer, 0, StateObject.BUFFER_SIZE, 0,
new AsyncCallback(Async_Send_Receive.Read_Callback), so);
}
第二个onDataReceived是并行执行的,还是数据在缓冲区中排队,下一个beginReceive在被调用后立即触发委托?
答案 0 :(得分:1)
数据排队到缓冲区。这些回调在线程池上执行,因此只要调用BeginReceive
,就可以触发回调。
答案 1 :(得分:0)
你必须明确地调用BeginReceive,但是在回调完成之前你不应该这样做。有关正确的示例,请参阅:http://msdn.microsoft.com/en-us/library/bew39x2a.aspx#Y53。 至于更一般的tcp问题,我认为它取决于tcp堆栈实现,但肯定有一个缓冲区,其中数据在较低级别累积。根据发送方的设置,如果接收方没有人在套接字上调用正确的接收方法,它可能会阻塞缓冲区已满。希望这会有所帮助。