套接字ReceiveAsync重用SocketAsyncEventArgs

时间:2014-08-26 13:36:45

标签: c# sockets asynchronous invalidoperationexception

我有一个网络设备,我使用套接字连接一次,连接一直保持打开状态,直到应用程序关闭。

现在我在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。简介:我需要保持连接存活,但只有当我确定我必须在那里有东西时,才能从中读取内容。一次只能拨打一个电话。一次发送,然后一次接收!

0 个答案:

没有答案