我正在努力找出我的MessageWebSocket.OutputStream
处置。
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);
}
}
一切都按预期工作,我可以毫无问题地调用requestChats()
,但是当我调用sendTextMessage()
时,我得到System.ObjectDisposedException
。我也可以调用requestChats()
而不是sendTextMessage()
。但是在我第二次调用这些方法之一之后,我将得到System.ObjectDisposedException
。
我很确定这是MessageWebSocket.OutputStream
被处置,但我不知道它在哪里被处置。但也许这是关于线程而不是关于处理的事情?
如果你需要任何额外的信息,尽管问。我一整天都在纠结这个问题。
编辑1:
还是不能解决问题。今天我尝试了以下方法:
- 将MessageWebSocket更改为ClientWebSocket:其他例外,但含义相同:
The WebSocket is in an invalid state ('Closed')
- 为WebSocket使用会话变量。这也没有解决问题
我感激每一个想法,即使它只是一个很小的想法…
我能够解决这个问题。在我发送数据之前,我总是创建一个新的DataWriter。现在我只创建一个DataWriter,它在我将WebSocket连接到服务器时被初始化。
我猜问题是,当数据写入器被垃圾收集器清理时,输出流被关闭。在我看来,数据写入器不应该有那么大的权力,但这是我唯一的解释。