我的MessageWebSocket.OutputStream在哪里处置?

时间:2016-09-21 11:59:14

标签: multithreading websocket stream dispose outputstream

我正在努力找出MessageWebSocket.OutputStream处置的位置。

WebsocketManager():

public WebsocketManager()
    {
        baseInit();
    }

baseInit():

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

连接():

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);
        }
    }

一切正常,我可以毫无问题地致电requestChats(),但当我致电sendTextMessage()时,我会得到一个System.ObjectDisposedException。我也可以拨打requestChats()而不是sendTextMessage()。但是在我第二次调用其中一种方法之后,我会得到System.ObjectDisposedException

我很确定它是被处置的MessageWebSocket.OutputStream,但我不知道它会被处置掉的地方。但也许它是关于线程而不是关于处理的东西?

如果您需要任何其他信息,请询问。我一直在努力解决这个问题。

编辑1:

仍然无法找出问题所在。今天我尝试了以下几点:

  • 将MessageWebSocket更改为ClientWebSocket:其他异常但它的含义相同: The WebSocket is in an invalid state ('Closed')
  • 为WebSocket使用会话变量。它没有解决问题

我很感激每一个想法,即使它只是一个非常小的想法......

1 个答案:

答案 0 :(得分:3)

我能够解决问题。在发送数据之前,我总是创建一个新的DataWriter。现在我只创建一个DataWriter,当我将WebSocket连接到服务器时,它会被初始化。

我想问题是当数据写入器被垃圾收集器清理时,输出流已关闭。 Imo数据编写者不应该拥有那么大的权力,但这是我唯一的解释。