我有一个网络设备,我使用套接字连接一次,连接一直保持打开状态,直到应用程序关闭。
现在我在C#中有一个封装了通信的类。有一个方法SendMessage到设备。我需要使用Socket.ReceiveAsync来获得响应。
假设有3种方法:1。GetEqValA(),GetEqValB(),GetEqValC(),它们使用设备的特定消息调用SendMessage。
我只创建了一个socket事件args的实例:
_completeArgs = new SocketAsyncEventArgs();
_completeArgs.SetBuffer(buffer, 0, buffer.Length);
_completeArgs.UserToken = _mySocket;
_completeArgs.RemoteEndPoint = _mySocket.RemoteEndPoint;
_completeArgs.Completed += new EventHandler<SocketAsyncEventArgs>(DataAvailable);
_mySocket.ReceiveAsync(_completeArgs);
现在,DataAvailable方法与下面的代码类似:
for (int i = 0; i < e.BytesTransferred; i++)
{
_tcpData.Add(e.Buffer[i]);
}
if (_tcpData.Count == _expectedTcpDataCount)
{
_expectedTcpDataCount = -1;
ProcessData();
// I don't want to put here, because it will wait for data until
// someone sends a message and the equipment responds with data
//_mySocket.ReceiveAsync(e);
}
else
{
_mySocket.ReceiveAsync(e);
}
现在,任何人都可以调用上面的3种方法,甚至是不同的线程。我确实有一个锁定机制。
我的问题是,如果我在SendMessage中重用_completeArgs来发送下一条消息,我得到一个异常,即这个eventArgs对象已被异步操作使用,而如果我这样做(但不是直接,通过采取DataAvailable中来自DataAvailable的SocketAsyncEventArgs e参数,没有问题。
_mySocket.ReceiveAsync(_completeArgs);
_mySocket.Send(pMessage);
我的想法是我不想一直调用ReceiveAsync,即使我知道那里什么也没有,但是我想在向设备发送任何消息之前调用ReceiveAsync,因为我知道我会得到的东西。
如果我在序列A,B,C中一个接一个地调用它们,则会在方法GetEqValC()中出现异常。
我不明白,你能帮助我吗?我能不能做我想做的事情? 我使用.NET 3.5。
P.S。简介:我需要保持连接存活,但只有当我确定我必须在那里有东西时,才能从中读取内容。一次只能拨打一个电话。一次发送,然后一次接收!