【问题标题】:C# Async Sockets (*Async, SocketAsyncEventArgs)C# 异步套接字 (*Async, SocketAsyncEventArgs)
【发布时间】:2010-01-11 03:51:18
【问题描述】:

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

我有点困惑如何/为什么会发生这种情况。这并不总是错误情况,对吧?在这种情况下,MSDN 示例会立即手动调用事件处理程序。这是一个很好的做法吗?

此外,例如,当我调用Socket.SendAsync 并将处理程序附加到SocketAsyncEventArgs.Completed 时,我是否保证会触发“已完成”(或SendAsync 返回false在发送了我的所有数据之后?或者它可能会在中间的某个地方调用我的处理程序?

【问题讨论】:

    标签: c# sockets asynchronous


    【解决方案1】:

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

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

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

    来自 MSDN:

    如果 I/O 操作处于挂起状态,则返回 true。 e 参数 上的 SocketAsyncEventArgs.Completed 事件将在操作完成时引发。

    如果 I/O 操作同步完成,则返回 false。在这种情况下,不会引发 e 参数上的 SocketAsyncEventArgs.Completed 事件,并且可以在方法调用返回后立即检查作为参数传递的 e 对象以检索操作结果。

    【讨论】:

    • 当您说“操作完成”(对于 SendAsync)时,“完成”是否意味着(您指定的)整个数据缓冲区已发送?直觉上,语义上,我在想“当然”,但我只想绝对积极。
    • 是的,对于 SocketAsyncEventArgs 的那个实例。也许 Socket.BeginXYZ / Socket.EndXYZ 方法会更好(无需担心同步完成 - 尽管该信息也会传递给回调)
    猜你喜欢
    • 2012-03-08
    • 2015-05-23
    • 1970-01-01
    • 2021-01-25
    • 1970-01-01
    • 2010-11-14
    • 2010-11-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多