Search code examples
multithreadingwebsocketstreamdisposeoutputstream

Where does my MessageWebSocket.OutputStream dispose?


I'm struggling to find out where my MessageWebSocket.OutputStream disposes.

WebsocketManager():

public WebsocketManager()
    {
        baseInit();
    }

baseInit():

private void baseInit()
    {
        messageWebsocket = new MessageWebSocket();
    }

connect():

public async void connect(string token, IEventAggregator eventAggregator, EvaLogger evaLogger)
    {
        try
        {
            messageWebsocket.SetRequestHeader("iPlanetDirectoryPro", token);
            _eventAggregator = eventAggregator;
            _evaLogger = evaLogger;
            _localDataManager = new SqliteLocalDataManager(_evaLogger, _eventAggregator);
            messageWebsocket.MessageReceived += OnMessageReceived;
            messageWebsocket.Closed += OnClosed;
            messageWebsocket.Control.MessageType = SocketMessageType.Utf8;
            await messageWebsocket.ConnectAsync(WSURI);
        }
        catch (Exception e)
        {
            _evaLogger.Error(e.Message, e);
        }
    }

requestChats():

public async void requestChats()
    {
        DataWriter dataWriter = new DataWriter(messageWebsocket.OutputStream);
        dataWriter.WriteString(WebsocketRequestFactory.Create(SocketEventsEnm.GET_CHATS));
        await SendData(dataWriter);
    }

sendTextMessage():

public async void sendTextMessage(long chatId, string message)
    {
        DataWriter dataWriter = new DataWriter(messageWebsocket.OutputStream);
        dataWriter.WriteString(WebsocketRequestFactory.Create(SocketEventsEnm.MESSAGE_OUT, chatId, message));
        await SendData(dataWriter);
    }

SendData():

private async Task SendData(DataWriter dataWriter)
    {
        try
        {
            _evaLogger.Info("Trying to send data...");
            await dataWriter.StoreAsync();
            _evaLogger.Info("Data was sent");
        }
        catch (Exception e)
        {
            _evaLogger.Error(e.Message, e);
        }
    }

Everything is working as intended, I can call requestChats() without a problem, but when I call sendTextMessage(), I get an System.ObjectDisposedException. I could also call requestChats() instead of sendTextMessage(). But after I call one of these methods a second time, I will get System.ObjectDisposedException.

I am pretty sure that it's the MessageWebSocket.OutputStream which is disposed, but I don't know where it's getting disposed. But maybe it's a thing about threads and not about disposing?

If you need any additional information, just ask. I keep struggling for the whole day with this issue.

EDIT 1:

Still couldn't figure out the problem. Today I tried the following things:

  • Change MessageWebSocket to ClientWebSocket: Other exception but it means the same: The WebSocket is in an invalid state ('Closed')
  • Use a session variable for the WebSocket. It didn't solve the problem either

I am grateful for every idea, even if it's just a very small one...


Solution

  • I was able to fix the problem. Before I send data, I was always creating a new DataWriter. Now I only create one DataWriter which gets initializied when I connect the WebSocket to the server.

    I guess the problem was that when the datawriter got cleaned by the garbage collector, the outputstream got closed. Imo the datawriter shouldn't have that much power, but that's my only explanation.