SocketAsyncEventArgs 疑问

coldyeah 2012-09-04 05:55:53
hello everyone
我现在学SocketAsyncEventArgs类,下载微软的示例代码看,有个地方不懂,希望大家能指导一下:
public void StartAccept(SocketAsyncEventArgs acceptEventArg)
{
if (acceptEventArg == null)
{
acceptEventArg = new SocketAsyncEventArgs();
acceptEventArg.Completed += new EventHandler<SocketAsyncEventArgs>(AcceptEventArg_Completed);
}
else
{
acceptEventArg.AcceptSocket = null;//清空连接socket
}

m_maxNumperOfAcceptedClients.WaitOne();//使用连接上限
bool willRaiseEvent = listenSocket.AcceptAsync(acceptEventArg);//开始接入连接
if (!willRaiseEvent)
{
ProcessAccept(acceptEventArg);
}
}

bool willRaiseEvent = listenSocket.AcceptAsync(acceptEventArg);这一句按msdn的介绍是开始异步接收连接。如果i/o挂起,将返回true,操作完成时,将引发 e 参数的 SocketAsyncEventArgs .Completed 事件。 如果 I/O 操作同步完成,将返回 false。 将不会引发 e 参数的 SocketAsyncEventArgs .Completed 事件,并且可能在方法调用返回后立即检查作为参数传递的 e 对象以检索操作的结果。 但是这个示例上的代码好像都会引发SocketAsyncEventArgs .Completed 事件。这样写有什么用呢?
谢谢
...全文
289 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
diorlv2010 2014-08-31
  • 打赏
  • 举报
回复
AcceptAsync会返回bool,如果是false,说明是同步链接,需要手工触发处理消息,如果返回true,会触发SEAE的Complete事件,在Complete中处理消息 所以会有这句 if (!willRaiseEvent) { ProcessAccept(acceptEventArg); } 异步的话,会 acceptEventArg.Completed += new EventHandler<SocketAsyncEventArgs>(AcceptEventArg_Completed); 调用AcceptEventArg_Completed
qldsrx 2012-09-05
  • 打赏
  • 举报
回复
微软的解释:
如果 I/O 操作同步完成,将返回 false。 将不会引发 e 参数的 SocketAsyncEventArgs.Completed 事件,并且可能在方法调用返回后立即检查作为参数传递的e 对象以检索操作的结果。

但事实却并非如此,微软经常喜好把东西设计的非常强大,看似强大,而实际却做不到,这里就是这种情况。微软的初衷正如MSDN上面解释的那样,示例代码也是根据MSDN的解释来写的,但反编译dll会发现,其实那个方法根本就是偷工减料的方法,它只会在失败的场合同步完成,返回false,成功的场合都是异步完成的。
总结下就是:同步完成的情况下,其处理结果肯定是失败;而异步完成的情况下,处理结果可能为成功,也可能为失败。
qldsrx 2012-09-05
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]
还有个问题:
const int opsToPreAlloc = 2; // read, write (don't alloc buffer space for accepts)
为什么申请2倍的缓冲。
[/Quote]
注释不是写着的吗?读、写缓存,读和写本身是分开的呀,它申请了一个大的缓存供读写一起用。

[Quote=引用 2 楼 的回复:]
怎么会呢,只有 willRaiseEvent 为true,才会会引发
[/Quote]
你就压根没看懂。true代表了异步执行,那样下面的代码就不需要进入,只有false才代表了同步完成。
SocketUpEx 2012-09-05
  • 打赏
  • 举报
回复
进来学习的


bdmh 2012-09-05
  • 打赏
  • 举报
回复
怎么会呢,只有 willRaiseEvent 为true,才会会引发
coldyeah 2012-09-05
  • 打赏
  • 举报
回复
还有个问题:
const int opsToPreAlloc = 2; // read, write (don't alloc buffer space for accepts)
为什么申请2倍的缓冲。

110,536

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧