我一直在使用.NET 3.5异步套接字API,并发现ll的* Async方法返回bool,如果操作同步完成,则返回false
。
我对如何/为何会发生这种情况感到困惑。它并不总是错误的条件,对吗?在这种情况下,MSDN示例立即手动调用事件处理程序。这是一个很好的做法吗?
此外,当我打电话给Socket.SendAsync
并将处理程序附加到SocketAsyncEventArgs.Completed
时,我保证会触发“已完成”(或SendAsync
返回false
) 所有我的数据发送后仅?或者它可能会在中间的某个地方调用我的处理程序吗?
答案 0 :(得分:2)
如果请求的操作可以立即执行,它可以同步返回,例如,如果TCP缓冲区已经包含完成ReceiveAsync方法所需的数据,或者客户端已经等待接受等等。
处理程序的示例,因为AsyncMethod不会。我很乐意在这种情况下直接调用处理程序(如果只有一个订阅)。然而,有一种做法表明你不应该,而不是处理程序不应该做任何事情,除了调用另一个处理逻辑的方法(可能更有意义的params) - 你应该调用这个方法而不是实际的事件/处理程序。
在操作完成之前不会引发事件,除非您在async方法返回true(未完成)时手动执行此操作。
来自MSDN:
如果I / O操作处于挂起状态,则返回 true 。在完成操作时,将引发e参数上的SocketAsyncEventArgs.Completed事件。
如果I / O操作同步完成,则返回 false 。在这种情况下,e参数上的SocketAsyncEventArgs.Completed事件将不会,并且在方法调用返回后立即检查作为参数传递的e对象以检索操作的结果。 / p>