【发布时间】:2009-12-21 05:20:56
【问题描述】:
在下面的简化代码中,检查 SendAsync() 是否已完成传输缓冲区中所有预期的字节是正确的做法?还是那是多余的?这是一个 TCP 连接套接字。我特别担心必须在 ProcessSend() 中对 SendAsync() 发出第二次子调用。
例如,如果我有多个线程使用新的(池化的)SocketAsyncEventArg 为每条消息向客户端传输数据,那么同时发送是否可能会在部分传输的消息之间插入自身?或者这是通过只允许一个 SocketAsyncEventArg 用于数据发送来控制对客户端的访问的一个很好的理由?
private void ProcessSend(SocketAsyncEventArgs e)
{
// Check that data was sent
if ((e.SocketError == SocketError.Success) && (e.BytesTransferred > 0))
{
AsyncSendUserToken token = (AsyncSendUserToken)e.UserToken;
// Check that all the data was sent
int offset = e.Offset + e.BytesTransferred;
if (offset < e.Count)
{
// Call send again to finish the send
e.SetBuffer(offset, e.Count - offset);
bool _willRaiseEvent = token.Socket.SendAsync(e);
if (!_willRaiseEvent)
ProcessSend(e);
}
}
}
【问题讨论】:
-
我也看到了这种情况,我还看到传输的字节数大于 e.Count - e.Offset 的情况。我正在重用一个 SocketAsyncEventArgs 进行发送,并调用一种填充缓冲区并从 ProcessSend 调用 SendAsync 的方法。我添加了代码来处理 ProcessSend 中的当前 SocketAsynEventArgs 并创建一个新的,这已经阻止了这个错误的发生。
标签: c# multithreading sockets sendasync