代码之家  ›  专栏  ›  技术社区  ›  Sapph

异步套接字(*async,socketAsyncEventArgs)

  •  1
  • Sapph  · 技术社区  · 15 年前

    我一直在使用.NET3.5异步套接字API,发现所有的*异步方法都返回一个bool,即 false 如果操作同步完成。

    我有点搞不清楚这是怎么发生的。这并不总是一个错误的情况,对吧?在这种情况下,msdn示例会立即手动调用事件处理程序。这是个好的做法吗?

    另外,当我打电话给 Socket.SendAsync 例如,并将处理程序附加到 SocketAsyncEventArgs.Completed ,我是否保证“已完成”被解雇(或 SendAsync 收益率 ) 只有 之后 全部的 我的数据已经发送了?或者它可能会在中间的某个地方调用我的处理程序?

    1 回复  |  直到 11 年前
        1
  •  2
  •   Courtney D    15 年前

    如果请求的操作可以立即执行,例如,如果TCP缓冲区已包含完成ReceiveAsync方法所需的数据,或者客户端已在等待接受,则它可能会同步返回。

    示例处理程序,因为AsyncMethod不会。在这种情况下,我很乐意直接使用invoke处理程序(如果只有一个订阅)。但是,有一个实践建议您不应该这样做,而是处理程序不应该做任何事情,除非调用另一个处理逻辑的方法(可能是使用更有意义的参数),并且您应该调用这个方法,而不是实际的事件/处理程序。

    除非在异步方法返回true(未完成)时手动执行,否则在操作完成之前不会引发事件。

    来自MSDN:

    退换商品 如果I/O操作挂起。e参数上的socketAsyncEventArgs.Completed事件 被抚养 完成 手术的结果。

    退换商品 如果I/O操作同步完成。在本例中,e参数上的socketAsyncEventArgs.completed事件 不会 在方法调用返回以检索操作结果后,可以立即引发并检查作为参数传递的E对象。