gpt4 book ai didi

c# - C#异步套接字(* Async,SocketAsyncEventArgs)

转载 作者:行者123 更新时间:2023-12-03 12:01:44 29 4
gpt4 key购买 nike

我一直在使用.NET 3.5异步套接字API,发现所有* Async方法都返回一个 bool 值,如果该操作同步完成,则它为false

我对如何/为什么会发生这种情况感到困惑。这并不总是错误的情况,对吗?在这种情况下,MSDN示例立即立即手动调用事件处理程序。这是遵循的好习惯吗?

另外,例如,当我调用Socket.SendAsync并将一个处理程序附加到SocketAsyncEventArgs.Completed上时,是否可以保证在发送了我的所有后,仅触发了“Completed”(或SendAsync返回false)吗?还是有可能在中间某个地方调用我的处理程序?

最佳答案

如果可以立即执行所请求的操作,例如,如果TCP缓冲区已经包含完成ReceiveAsync方法所需的数据,或者客户端已经在等待接受,则它可能会同步返回。
该示例为处理程序,因为AsyncMethod不会。在这种情况下(如果只有一个订阅),我很乐意使用直接调用处理程序。但是,有一种做法建议您不应该这样做,而应该使处理程序不执行任何操作,只能调用另一个处理逻辑的方法(可能带有更有意义的参数),并且应该调用此方法,而不是实际的事件/处理程序。
在操作完成之前,不会引发该事件,除非您当然会在async方法返回true(未完成)时手动进行此操作。
从MSDN:

Returns true if the I/O operation is pending. The SocketAsyncEventArgs.Completed event on the e parameter will be raised upon completion of the operation.

Returns false if the I/O operation completed synchronously. In this case, The SocketAsyncEventArgs.Completed event on the e parameter will not be raised and the e object passed as a parameter may be examined immediately after the method call returns to retrieve the result of the operation.

关于c# - C#异步套接字(* Async,SocketAsyncEventArgs),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2039809/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com