c# 官方websocket ReceiveAsync 和 SendAsync 调用出现异常的问题总结

背景

最近在使用websocket客户端进行与服务器通信,以前开发一般使用http 轮询的方式实现与服务器任务系统 ,为了方便我就使用c# 自带的websocket,结果导致我花了不必要的时间在解决ReceiveAsync 与 SendAsync 导致的异常问题上面。

 

问题代码

public async void startRecv()
{
if (isLocalTest) return;

while (true)
{
try
{
string showInfo = "StartReceiving:" + Thread.CurrentThread.Name + " ----:" + Thread.CurrentThread.ManagedThreadId;
Console.WriteLine(showInfo);

var array = new byte[4096];
var result = await mClientWebSocket.ReceiveAsync(new ArraySegment<byte>(array), CancellationToken.None);
if (mClientWebSocket.State == WebSocketState.Open)
{
if (result.MessageType == WebSocketMessageType.Text)
{
string msg = Encoding.UTF8.GetString(array, 0, result.Count);
Console.WriteLine("--> {0}", msg);
PacketFacotry.instance.process_packet(msg);
}
}

}
catch (Exception e)
{
Console.WriteLine(e.StackTrace);
Console.WriteLine(e.Message);
Console.WriteLine("websocket异常断开了");
//进行重连逻辑
ReConnect();
break;
}
}
}

在websocekt 连接就会调用该函数,那么就会一直接受数据,然后处理对应包,调用对应的逻辑处理,但问题我会在另外一个单独线程做有关的外部数据,一旦触发对应数据就会发送数据到websocket服务器上面,但是如果在高频率出发送数据到websocket就会触发异常 此 WebSocket 实例已存在一个未完成的“SendAsync”调用。可以同时调用 ReceiveAsync 和 SendAsync,但最多同时允许对每个请求执行一项待完成的操作。这个异常真的非常奇怪,感觉是一个很正常的逻辑,我在一个线程接收数据,然后可能在任何线程调用SendAsync,我根本就不应该关心是否完成操作,然后google了半天,基本没有太多有关系,看了很多老外说不能并行调用,意思就是ReceiveAsync 和 SendAsync 只能串行调用,这点要非常不能理解,我虽然其中在我后面通过SendAsync.wait() 来解决问题,但没法百分百保证他们2个是串行,因为有很多别的逻辑插入进来,所以最后换第三方库websocketsharp来解决问题

结论

不要使用c#自带的webscoekt,如果你的websocket是并行调用的话,我不想自己写代码来保证串行,这个应该库来保证,而不用开发者来保证

发表评论

电子邮件地址不会被公开。 必填项已用*标注