"Невозможно получить доступ к удаленному объекту. \ R \ nИмя объекта: 'System.Net.Sockets.NetworkStream' - PullRequest
0 голосов
/ 24 сентября 2019

В ClientClass у меня две темы;один для соединения TCP-IP с локальным узлом, а другой для продолжения получения сообщений от локального узла.

В случае разрыва соединения я закрываю соединение, используя m_DeviceClientSocket.Close() внутри блока catch метода ConnectToDeviceAndMonitorConnection().

ПРОБЛЕМА: Поскольку я закрываю соединение с сокетом, следовательно, весь объект m_DeviceClientSocket разыменовывается.Это приводит к другой ошибке внутри блока catch метода GetMessagesFromDevice(), и ошибка говорит (как показано в блоке catch кода):

"Невозможно получить доступ к удаленному объекту. \r \ nИмя объекта: 'System.Net.Sockets.NetworkStream'

ВОПРОС: Как создать объект m_DeviceClientSocket, который может быть закрыт, повторно подключен и доступенв обе темы?

class ClientClass
{
    Thread t1_DeviceConnectionMonitor, t2_receiveDeviceMessages;
    static readonly object m_IsConnectedToDevice_Locker = new object();
    bool m_IsConnectedToDevice = false;

    //Device - Communication Variables
    string m_DeviceURL = "127.0.0.1";
    int m_DevicePort = 23;
    TcpClient m_DeviceClientSocket = new TcpClient();
    NetworkStream m_DeviceServerStream = default(NetworkStream);

    public ClientClass()
    {
        //Thread for CONNECTION Monitoring
        t1_DeviceConnectionMonitor = new Thread(ConnectToDeviceAndMonitorConnection);
        t_DeviceConnectionMonitor.Start();

        //Thread to RECEIVE messages
        t2_receiveDeviceMessages = new Thread(GetMessagesFromDevice);
        t2_receiveDeviceMessages.Start();
    }

    //Connect to Device
    void ConnectToDeviceAndMonitorConnection()
    {
        while (true)
        {
            if (!m_IsConnectedToDevice)
            {
                try
                {
                    //Connect to device server
                    m_DeviceClientSocket.Connect(m_DeviceURL, m_DevicePort);
                    m_DeviceServerStream = m_DeviceClientSocket.GetStream();
                    SetDeviceConnectionStatus(true);
                }
                catch (SocketException se)
                {
                    if (m_DeviceClientSocket.Connected)
                        m_DeviceClientSocket.Close(); //This Close() statement dereference the complete "m_DeviceClientSocket" object
                }
            }
        }
    }

    //RECEIVE messages from the device
    public void GetMessagesFromDevice()
    {
        string messageReceivedFromDevice;

        while (true)
        {
            try
            {
                var buffersize = m_DeviceClientSocket.ReceiveBufferSize;
                byte[] instream = new byte[buffersize];

                int status = m_DeviceServerStream.Read(instream, 0, buffersize);
                if (status == 0)
                {
                    SetDeviceConnectionStatus(false);
                }
                messageReceivedFromDevice = System.Text.Encoding.ASCII.GetString(instream);
            }

            catch (Exception e)
            {
                //I ENETER HERE AND THE EXCEPTIONS SAYS: ""Cannot access a disposed object.\r\nObject name: 'System.Net.Sockets.NetworkStream'"
            }
        }
    }

    //Thread Safety is needed to set the device connection status
    public void SetDeviceConnectionStatus(bool status)
    {
        lock (m_IsConnectedToDevice_Locker)
        {
            m_IsConnectedToDevice = status;
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...