在套接字主要发送数据并且看起来基本上类似于以下代码片段的情况下,我有时会在CompletedHandler
中进行重入,其中由IOCP框架进行的两次调用和第二次回调,这是结果在前一个回调中的SendAsync
,超过了发起者。这有些出乎意料,导致.Net重新发送以前的数据包,而不是SetBuffer设置的新数据包。
socketAsyncEventArgs.Completed = CompletedHandler;
...
void CompletedHandler(object sender, SocketAsyncEventArgs e)
{
log(threadId + " A");
socketAsyncEventArgs.SetBuffer(...);
log(threadId + " B");
_socket.SendAsync(socketAsyncEventArgs);
log(threadId + " Z");
}
然后日志显示为:
1 A
1 B
2 A
2 B
1 Z
2 Z
这种行为是期待的吗?或者我错误地使用它?
这基本上意味着我必须要么将SendAsync
的调用放入一个关键部分,要么使用多个SocketAsyncEventArgs,我试图避免(否则我每次都要创建一个新的,或者汇集它们,这也需要同步)。