C#WebSocket.SendAsync()会随机卡住
在套接字连接后,我使用以下代码从WPF使用System.Net.WebSocket发送C#WebSocket.SendAsync()会随机卡住,c#,wpf,C#,Wpf,在套接字连接后,我使用以下代码从WPF使用System.Net.WebSocket发送 try { Console.WriteLine("Sending..."); await _ws.SendAsync(new ArraySegment<byte>(packet.GetBytes()), WebSocketMessageType.Binary, true, CancellationToken.None); Console.WriteLine("Sent...
try
{
Console.WriteLine("Sending...");
await _ws.SendAsync(new ArraySegment<byte>(packet.GetBytes()), WebSocketMessageType.Binary, true, CancellationToken.None);
Console.WriteLine("Sent...");
}
catch(Exception e)
{
Console.WriteLine(e.Message);
}
接收代码(Asp.Net核心)
公共异步任务StartReceiveAsync(接收操作)
{
WebSocketReceiveResult结果;
var buffer=新字节[4*1024];
var stream=newmemoryStream();
做
{
结果=wait _ws.ReceiveAsync(新的ArraySegment(缓冲区),CancellationToken.None);
wait stream.WriteAsync(缓冲区,0,result.Count);
if(result.EndOfMessage)
{
var packet=binarypack.FromRaw(stream.ToArray());
onReceive.Invoke(数据包);
}
}
而(!result.CloseStatus.HasValue);
处置();
}
我确实收到了一些数据,但在几个数据包之后,套接字卡在SendAsync中。即使等了几分钟也不会回来
好的,我想出来了。我的onReceive.Invoke()函数有时引发异常,导致服务器停止接收。这使得接收缓冲区填满,WebSocket.SendAsync被卡住,并等待缓冲区空闲。在try catch中包装onReceive.Invoke()之后,代码现在运行良好
try
{
onReceive.Invoke(packet);
}
catch(Exception e)
{
Debug.WriteLine(e.Message);
}
调用代码是什么样子的?您是否一直在使用async/await?显示更多代码…查看线路的另一端以诊断此问题。如果它没有调用Receive(),那么当TCP传输缓冲区被填满时,您的程序最终会被卡住。我已经添加了发送和接收代码。我在循环中不断接收,如果缓冲区被填满,它应该在几个接收调用中变为空。我敢打赌,有人正在以某种方式处理句柄,失败源于此..这种情况发生在QueueClient(几乎25秒延迟)SendAsync中,不涉及接收器。我看到2个websocket跟踪,出现101个状态代码。
public async Task StartReceiveAsync(Action<Packet> onReceive)
{
WebSocketReceiveResult result;
var buffer = new byte[4 * 1024];
var stream = new MemoryStream();
do
{
result = await _ws.ReceiveAsync(new ArraySegment<byte>(buffer), CancellationToken.None);
await stream.WriteAsync(buffer, 0, result.Count);
if (result.EndOfMessage)
{
var packet = BinaryPacket.FromRaw(stream.ToArray());
onReceive.Invoke(packet);
}
}
while (!result.CloseStatus.HasValue);
Dispose();
}
try
{
onReceive.Invoke(packet);
}
catch(Exception e)
{
Debug.WriteLine(e.Message);
}