【发布时间】:2017-06-13 16:44:27
【问题描述】:
我有时会收到此错误:
已使用此 SocketAsyncEventArgs 实例进行异步套接字操作。
...当我尝试拨打 SocketServiceEventArgs.SetBuffer()
我意识到这是因为一个实例只能执行一个操作并且它必须处于使用状态。但是我再次调用它,因为在客户端之前的超时之后,我希望尝试重新发送请求。我不希望关闭此套接字并使用新的套接字,因为这样与客户端的连接将中断。
但是,我需要做的是在执行此操作之前检查另一个操作是否已经在进行,如果是,则终止它,以便我可以再次发送。
我用来发送的代码是
saeaCommunicationObject.AcceptSocket.SendAsync(saeaCommunicationObject)
但更有可能正在进行的是接收
saeaCommunicationObject.AcceptSocket.ReceiveAsync(saeaCommunicationObject))
(saeaCommunicationObject 是 SocketAsyncEventArgs)。
在研究中,我遇到过
AcceptSocket.EndReceive(IAsyncResult asyncResult)
但我不确定这是否正确,而且我不知道从哪里获得 asyncResult(所以如果这是正确的,我的问题是,这应该来自哪里?)
那么我可以做些什么来检查它是否正在进行中(如果是,则终止它)?
编辑
我看过的一个地方建议(但不推荐)使用 P/Invoke 使用 CancelIoEx() - 但是我无法让它工作,而且关于此的文档很少。
[DllImport("kernel32.dll", CallingConvention = CallingConvention.Cdecl)]
[return: MarshalAs(UnmanagedType.Bool)]
private static extern bool CancelIoEx(IntPtr hFile);
private void CancelReceive() {
bool result = CancelIoEx(saeaCommunicationObject.AcceptSocket.Handle)
// etc.
}
我得到result = false。我也试过CancelIo(),当我得到result = true时,当我尝试调用SetBuffer()时,会抛出同样的异常。
TL;DR
一旦调用了ReceiveAsync(),那么现在套接字正在等待输入以触发Completed 事件,我该如何取消这个请求?
【问题讨论】:
-
你有没有想过这个问题?